2016-04-02 14 views
16

Mam tabeli tak:laravel Eloquent gdzie pole jest X lub zerowa

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

Teraz chcę, aby wszystkie wpisy, gdzie pole1 wynosi 1, pole2 jest nieważna i gdzie datefield jest mniejsza niż X lub null. Próbowałem już czegoś takiego:

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

ale to nie działa. Zawsze otrzymuję każdy wpis, w którym data ma wartość zerową. Nie ma znaczenia, jakie są pozostałe pola. Próbowałem również podzielić go na 2 kwerendy: Najpierw uzyskać każdy wiersz, gdzie data jest mniejsza niż X lub null, a następnie (w oparciu o to) uzyskać wszystkie pola, gdzie pole 1 wynosi 1, a pole 2 ma wartość null.

Wynik był taki sam. Każdy pomysł, jak to zrobić?

Odpowiedz

32

Wygląda na to, że musisz skorzystać z advanced where clauses.

Biorąc pod uwagę, że wyszukiwanie w field1 i field2 jest stałe, pozostawiamy je w niezmienionej postaci, ale dostosujemy nieco wyszukiwanie w numerze datefield.

Spróbuj tego:

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

Jeśli kiedykolwiek potrzebne do debugowania kwerendy i zobaczyć, dlaczego to nie działa, to może pomóc, aby zobaczyć co SQL jest faktycznie wykonywany. Możesz połączyć łańcuch ->toSql() na końcu swojej wymownej kwerendy, aby wygenerować kod SQL.

+0

To zaoszczędziło mi frustracji! Dzięki. –

+0

można to zrobić przez coś takiego: whereIn ('column', ['value', null])? – MASh

+0

@MASH nie jestem pewien. Napisałem to dość dawno temu i było to najlepsze podejście w tamtym czasie. Dlaczego nie spróbować? – James

Powiązane problemy