2016-04-02 13 views
16

Ho una tabella come questa:laravel Eloquente dove il campo è X o null

table 
- field1: tinyint 
- field2: varchar (nullable) 
- datefield: timestamp (nullable) 

Ora voglio ottenere tutte le voci in cui field1 è 1, campo2 è nullo e dove datefield è più piccolo di X o nullo. Ho già provato qualcosa di simile:

$query = Model::where('field1', 1) 
      ->whereNull('field2') 
      ->where('datefield', '<', $date) 
      ->orWhereNull('datefield'); 

ma questo non funziona. Ricevo sempre tutte le voci in cui il campo data è nullo. Non importa quali siano gli altri campi. Ho anche provato a dividerlo in due query: prima prendi ogni riga dove il campo data è più piccolo di X o null e poi (basato su di esso) ottieni ogni campo dove field1 è 1 e field2 è null.

Il risultato è stato lo stesso. Qualche idea su come farlo?

risposta

32

Sembra che sia necessario utilizzare advanced where clauses.

Dato che la ricerca in field1 e field2 è costante, li lasceremo così com'è, ma abbiamo intenzione di regolare la ricerca in datefield un po '.

Prova questo:

$query = Model::where('field1', 1) 
    ->whereNull('field2') 
    ->where(function ($query) { 
     $query->where('datefield', '<', $date) 
      ->orWhereNull('datefield'); 
    } 
); 

Se hai bisogno di eseguire il debug di una query e vedere il motivo per cui non funziona, può aiutare a vedere che cosa SQL in realtà è in esecuzione. È possibile concatenare ->toSql() alla fine della query eloquente per generare l'SQL.

+0

Questo mi ha salvato un po 'di frustrazione! Grazie. –

+0

può essere fatto da qualcosa di simile: whereIn ('column', ['value', null])? – MASh

+0

@MASh non sono sicuro. L'ho scritto un po 'di tempo fa ed era l'approccio migliore all'epoca. Perché non provarlo? – James

Problemi correlati