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
Marwelln
źródło
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')
Bas
źródło
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', '<>', '');
}
Atiqur
źródło
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
9

Jeśli chcesz użyć fasady DB :

DB::table('table_name')->whereNotNull('sent_at')->get();

Jon
źródło
4

Możemy użyć

Model::whereNotNull('sent_at');

Lub

Model::whereRaw('sent_at is not null');
Srmilon
źródło
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.

Rockin4Life33
źródło
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.

Carding Ermita Sungkit
źródło
-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();
użytkownik4397894
źródło
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