2014-04-24 10 views
6

Diese Abfrage gibt NULL zurück, wenn ein Objekt erwartet wird.Laravel! = Operator in wo nicht funktioniert

$vow = DB::table('media_featured')->where('is_video_of_the_week', 1)-> 
where('video_of_week_expired', '!=', 1)->first(); 

CREATE TABLE `media_featured` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`media_id` int(10) unsigned DEFAULT NULL, 
`is_video_of_the_week` tinyint(1) DEFAULT NULL, 
`is_featured` tinyint(1) DEFAULT NULL, 
`video_of_week_expired` tinyint(1) DEFAULT NULL, 
`featured_expired` tinyint(1) DEFAULT NULL, 
`created_at` timestamp NULL DEFAULT NULL, 
`updated_at` timestamp NULL DEFAULT NULL, 
`deleted_at` timestamp NULL DEFAULT NULL, 
PRIMARY KEY (`id`), 
KEY `media_featured_media_id_foreign` (`media_id`), 
CONSTRAINT `media_featured_media_id_foreign` FOREIGN KEY (`media_id`) REFERENCES `media`  (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

könnte ein Rekord is_video_of_the_week = 1 und video_of_week_expired = NULL haben aber die obige Abfrage gibt null.

Irgendwelche Ideen?

Antwort

7

NULL Werte sind nicht gleich oder nicht gleich wie alles andere.

So ist column != NULL immer falsy sowie column = NULL

Um zu überprüfen, ob eine Spalte NULL Wert enthält, die Sie benötigen IS NULL Operator zu verwenden.

Bei Laravel db Abfrage-Generator können Sie

->whereNull('video_of_week_expired') 

Methode verwenden.

PS: wenn video_of_week_expired angenommen wird, eine Flag-alike Spalte sein, sollten Sie besser machen es NOT NULL und 0/1 Werte verwenden, statt NULL/1

+0

Das obige funktionierte für mich, bevor ich auf SO postete. Ich plane, die Spalte als is_expired = 1 zu markieren, sobald sie nicht mehr angezeigt wird. Deshalb wollte ich im Gegensatz zu whereNull mit not = 1 vergleichen, aber ich muss wohl in meiner Codeausführung vorsichtig sein. – egekhter

+0

@egechter: ok, also? – zerkms

+0

Macht Sinn, danke für die Richtung. – egekhter

0

Basierend auf den documentation und die source-code.

sollten Sie whereNull verwenden:

$vow = DB::table('media_featured') 
      ->where('is_video_of_the_week', 1) 
      ->whereNull('video_of_week_expired') 
      ->first(); 
8

Wenn der Wert für video_of_week_expired ist NULL oder 1 dann können Sie

verwenden -> whereNull()

sonst , wenn die Wert ist wie eine Flagge 0 oder 1, dann können Sie versuchen, mit

-> where ('video_of_week_expired', '<>', 1)

Hier <> ist ein 'nicht gleich' Betreiber.