Wie prüft man mit Eloquent, ob nicht null?


218

Wie können Sie mit Eloquent überprüfen, ob ein Feld nicht null ist ?

Ich habe es versucht, Model::where('sent_at', 'IS NOT', DB::raw('null'))->...aber es gibt IS NOTeine Bindung anstelle eines Vergleichs.

Das DB::getQueryLog()sagt es darüber:

  '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

Sie könnten versuchen, !=anstelle von IS NOT zu verwenden.
JaTochNietDan

1
@JaTochNietDan Der Operator! = Funktioniert nicht mit NULL-Werten. In der MySQL-Dokumentation heißt es : "Sie können keine arithmetischen Vergleichsoperatoren wie =, <oder <> verwenden, um auf NULL zu testen."
Soulriser

Antworten:


402

Eloquent hat dafür eine Methode (Laravel 4. * / 5. *);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')

1
Ich muss die Null bei gelöschtem Feld überprüfen, also habe ich dies in geändert whereNull('deleted_at')und meine Abfrage ausgeführt.
Tarunn

7
Ein weiteres undokumentiertes Feature. Nun, es sei denn, Sie zählen die API-Dokumente, aber in der Hauptdokumentation von Laravel wird dies nicht erwähnt.
Aross

12
Die whereNotNull()Methode (und mehrere andere, die zuvor nicht dokumentiert waren) wurden der Dokumentation in Version 5.1 hinzugefügt: laravel.com/docs/5.1/queries#where-clauses .
Ben Johnson

@aross aber in Query Builder, nicht in Eloquent (Laravel 5.1)
pmiranda

@pmiranda nicht sicher, was du meinst, aber mein Kommentar war vor 4 Jahren und über Laravel 4, heute sind wir bei Laravel 6. Ich denke, die Situation hat sich geändert. Obwohl Laravels Hauptdokumentation noch nicht sehr vollständig ist, fühlt es sich eher wie eine Reihe von Anleitungen an.
Aross

20

Wenn jemand wie ich dies mit dem Abfrage-Generator in Laravel 5.2.23 tun möchte, kann dies wie folgt erfolgen: ->

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

Oder mit Umfang im Modell:

public function scopeNotNullOnly($query){

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

1
Wofür 'and'steht das?
Senty

1
Eigentlich macht 'und' hier nichts, aber es würde tun, wenn der erste Parameter ein Array wäre. Hier ist der Methodenprototyp: public function where($column, $operator = null, $value = null, $boolean = 'and'); und Ort -".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
Atiqur


4

Wir können benutzen

Model::whereNotNull('sent_at');

Oder

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

4

Ich sehe, dass diese Frage etwas alt ist, aber ich bin darauf gestoßen und habe nach einer Antwort gesucht. Obwohl ich mit den Antworten hier keinen Erfolg hatte, denke ich, dass dies daran liegen könnte, dass ich auf PHP 7.2 und Laravel 5.7 bin . oder möglich, weil ich nur mit Laravel Tinker mit einigen Daten auf der CLI herumgespielt habe.

Ich habe einige Dinge ausprobiert, die für mich funktioniert haben, und andere, von denen ich nicht hoffe, dass sie anderen helfen.


Ich hatte keinen Erfolg beim Laufen:

    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();    // []

Alle oben genannten haben ein leeres Array für mich zurückgegeben


Ich hatte jedoch Erfolg beim Laufen:

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

Dies gab alle Ergebnisse in einem Array zurück, wie ich erwartet hatte. Hinweis: Sie können das Feld löschenall() und eine Illuminate \ Database \ Eloquent \ Collection anstelle eines Arrays zurückerhalten, wenn Sie dies bevorzugen.


0

In Laravel 5.4 funktionierte dieser Code Model::whereNotNull('column')nicht. Sie müssen ihn get()wie diesen hinzufügen. Dieser Code Model::whereNotNull('column')->get();funktioniert gut für mich.


-11

Wenn Sie nach gelöschten Datensätzen suchen möchten (Soft Deleted Record), verwenden Sie Eloquent Model Query nicht. Verwenden Sie stattdessen die Abfrage Db :: table, z. B. Anstatt Below:

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

Verwenden:

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

Diese Antwort hat nichts mit der Frage zu tun. Außerdem müssen Sie nicht verwenden Db::table, um die weich gelöschten Datensätze zu finden. Sie können sie mit der Methode filtern withTrashed(), wie in den Dokumenten angegeben: laravel.com/docs/5.3/eloquent
gvsrepins
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.