Jak sprawdzasz „jeśli nie zerowy” w Eloquent?


218

Jak sprawdzić, czy pole Eloquent nie jest puste ?

Próbowałem, Model::where('sent_at', 'IS NOT', DB::raw('null'))->...ale daje IS NOTporównanie jako porównanie.

Oto co DB::getQueryLog()o tym mówi:

  'query' => string 'select * from my_table where sent_at = ? and profile_id in (?, ?) order by created_at desc' (length=101)
  'bindings' => 
    array (size=3)
      0 => string 'IS NOT' (length=6)
      1 => int 1
      2 => int 4

Możesz spróbować użyć !=zamiast NIE JEST.
JaTochNietDan

1
@JaTochNietDan Operator! = Nie działa z wartościami NULL. Zgodnie z dokumentacją MySQL : „Do testowania NULL nie można używać operatorów porównania arytmetycznego, takich jak =, <lub <>.”
Soulriser,

Odpowiedzi:


402

Eloquent ma na to sposób (Laravel 4. * / 5. *);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')

1
Muszę sprawdzić pole zerowane przy usuniętym polu, więc zmieniłem to na whereNull('deleted_at')i uruchomiłem moje zapytanie.
Tarunn

7
Kolejna nieudokumentowana funkcja. Cóż, chyba że policzysz dokumenty API, ale główna dokumentacja Laravela nie wspomina o tym.
aross

12
whereNotNull()Metoda (i kilka innych, które zostały wcześniej nieudokumentowane) zostały dodane do dokumentacji w wersji 5.1: laravel.com/docs/5.1/queries#where-clauses .
Ben Johnson,

@aross, ale w Query Builder, nie w Eloquent (Laravel 5.1)
pmiranda

@pmiranda nie jestem pewien, co masz na myśli, ale mój komentarz był 4 lata temu i o Laravel 4, obecnie jesteśmy w Laravel 6. Chyba sytuacja się zmieniła. Chociaż główna dokumentacja Laravela wciąż nie jest bardzo kompletna, wydaje się być raczej zbiorem przewodników.
aross

20

Jeśli ktoś taki jak ja chce to zrobić za pomocą konstruktora zapytań w Laravel 5.2.23, można to zrobić jak ->

 $searchResultQuery = Users::query(); 
 $searchResultQuery->where('status_message', '<>', '', 'and'); // is not null
 $searchResultQuery->where('is_deleted', 'IS NULL', null, 'and'); // is null 

Lub z zakresem w modelu:

public function scopeNotNullOnly($query){

    return $query->where('status_message', '<>', '');
}

1
co 'and'oznacza
senty

1
Właściwie tutaj „i” nic nie robi, ale zrobiłoby to, gdyby pierwszy parametr był tablicą. Oto prototyp metody: public function where($column, $operator = null, $value = null, $boolean = 'and'); i lokalizacja -".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
Atiqur


4

Możemy użyć

Model::whereNotNull('sent_at');

Lub

Model::whereRaw('sent_at is not null');

4

Widzę, że to pytanie jest trochę stare, ale natknąłem się na nie, szukając odpowiedzi. Mimo że nie udało mi się uzyskać odpowiedzi tutaj, myślę, że może tak być, ponieważ korzystam z PHP 7.2 i Laravel 5.7. lub możliwe, ponieważ po prostu bawiłem się niektórymi danymi na temat interfejsu CLI, używając Laravela Tinkera.

Mam kilka rzeczy, które próbowałem, które działały dla mnie, i inne, których nie mam nadziei, że pomogą innym.


Nie udało mi się uruchomić:

    MyModel::whereNotNull('deleted_by')->get()->all();             // []
    MyModel::where('deleted_by', '<>', null)->get()->all();        // []
    MyModel::where('deleted_by', '!=', null)->get()->all();        // []
    MyModel::where('deleted_by', '<>', '', 'and')->get()->all();   // []
    MyModel::where('deleted_by', '<>', null, 'and')->get()->all(); // []
    MyModel::where('deleted_by', 'IS NOT', null)->get()->all();    // []

Wszystkie powyższe zwróciły mi pustą tablicę


Miałem jednak sukces:

    DB::table('my_models')->whereNotNull('deleted_by')->get()->all(); // [ ... ]

To zwróciło wszystkie wyniki w tablicy, jak się spodziewałem. Uwaga: możesz upuścić all()i odzyskać Illuminate \ Database \ Eloquent \ Collection zamiast tablicy, jeśli wolisz.


0

w laravel 5.4 ten kod Model::whereNotNull('column')nie działał, musisz dodać get()jak ten, Model::whereNotNull('column')->get();ten działa dla mnie dobrze.


-11

Jeśli chcesz przeszukać usunięty rekord (miękko usunięty rekord), nie używaj Eloquent Model Query. Zamiast tego użyj zapytania Db :: table, np. Zamiast korzystania z opcji Poniżej:

$stu = Student::where('rollNum', '=', $rollNum . '-' . $nursery)->first();

Posługiwać się:

$stu = DB::table('students')->where('rollNum', '=', $newRollNo)->first();

Ta odpowiedź nie ma nic wspólnego z pytaniem. Poza tym nie musisz używać, Db::tableaby znaleźć miękkie usunięte rekordy. Można je filtrować za pomocą metody withTrashed(), jak podano
gvsrepins
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.