2014-04-24 11 views
6

Questa query restituisce null quando è previsto un oggetto.Laravel! = Operatore in cui non funziona

$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; 

Un record potrebbe avere is_video_of_the_week = 1 e video_of_week_expired = NULL ma la query precedente restituisce null.

Qualche idea?

risposta

7

NULL valori non sono uguali o non equivalgono a nient'altro.

Così column != NULL è sempre falsy così come column = NULL

Per verificare se una colonna contiene NULL valore è necessario utilizzare IS NULL operatore.

In caso di laravel generatore di query db si potrebbe usare

->whereNull('video_of_week_expired') 

metodo.

PS: se video_of_week_expired si presume essere una colonna di bandiera allo stesso modo, è meglio che lo rendono NOT NULL e utilizzare 0/1 valori, invece di NULL/1

+0

Quanto sopra ha funzionato per me prima di pubblicare su SO. Sto pianificando di contrassegnare la colonna come is_expired = 1 una volta che non è più presente, è per questo che ho voluto confrontarmi con non = 1 invece di whereNull, ma suppongo che dovrò fare attenzione nell'esecuzione del codice? – egekhter

+0

@egekhter: ok, allora? – zerkms

+0

Ha senso, grazie per la direzione. – egekhter

0

Sulla base della documentation e source-code.

Si dovrebbe usare whereNull:

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

Se il valore per video_of_week_expired è NULL o 1 quindi è possibile utilizzare

-> whereNull()

altro se il il valore è come una bandiera 0 o 1 allora si può provare a utilizzare

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

Qui <> è un operatore 'non uguale a'.

Problemi correlati