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.