Come controlli "se non nullo" con Eloquent?


235

Come si controlla se un campo non è nullo con Eloquent?

Ho provato Model::where('sent_at', 'IS NOT', DB::raw('null'))->...ma dà IS NOTcome un legame invece di un confronto.

Questo è ciò che DB::getQueryLog()dice al riguardo:

  '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

Potresti provare a usare !=invece di IS NOT.
— JaTochNietDan

1
@JaTochNietDan L'operatore! = Non funziona con i valori NULL. Secondo la documentazione di MySQL : "Non è possibile utilizzare operatori di confronto aritmetico come =, <o <> per verificare la presenza di NULL."
— Soulriser

Risposte:


432

Eloquent ha un metodo per questo (Laravel 4. * / 5. *);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')

1
Devo controllare il valore nullo nel campo cancellato, quindi l'ho cambiato in whereNull('deleted_at')e ho avviato la mia query.
— Tarunn

7
Un'altra caratteristica non documentata . Bene, a meno che non si contino i documenti API, ma la documentazione principale di Laravel non ne fa menzione.
— arriverà il

12
Il whereNotNull()metodo (e molti altri che in precedenza non erano documentati) sono stati aggiunti alla documentazione nella versione 5.1: laravel.com/docs/5.1/queries#where-clauses .
— Ben Johnson

@aross ma in Query Builder, non in Eloquent (Laravel 5.1)
— pmiranda

@pmiranda non è sicuro di cosa intendi, ma il mio commento è stato di 4 anni fa e su Laravel 4, oggi siamo a Laravel 6. Immagino che la situazione sia cambiata. Sebbene la documentazione principale di Laravel non sia ancora molto completa, sembra più un mucchio di guide.
— arriverà il

21

Se qualcuno come me vuole farlo con il generatore di query in Laravel 5.2.23, può essere fatto come ->

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

O con ambito nel modello:

public function scopeNotNullOnly($query){

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

1
cosa 'and'significa?
— senty

1
In realtà qui 'e' non fa nulla ma lo farebbe se il primo parametro fosse un array. Ecco il prototipo del metodo: public function where($column, $operator = null, $value = null, $boolean = 'and'); e posizione -".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
— Atiqur

10

Se si desidera utilizzare la facciata DB :

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


7

Possiamo usare

Model::whereNotNull('sent_at');

O

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

4

Vedo che questa domanda è un po 'vecchia ma mi sono imbattuto in cerca di una risposta. Anche se non ho avuto successo con le risposte qui, penso che potrebbe essere perché sono su PHP 7.2 e Laravel 5.7.o possibile perché stavo solo giocando con alcuni dati sulla CLI usando Laravel Tinker.

Ho provato alcune cose che hanno funzionato per me e altre che non hanno funzionato che spero possano aiutare gli altri.


Non ho avuto successo eseguendo:

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

Tutto quanto sopra ha restituito un array vuoto per me


Tuttavia ho avuto successo eseguendo:

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

Ciò ha restituito tutti i risultati in una matrice come mi aspettavo. Nota: puoi rilasciare all()e recuperare un Illuminate \ Database \ Eloquent \ Collection invece di un array, se preferisci.


0

in laravel 5.4 questo codice Model::whereNotNull('column')non funzionava, devi aggiungere get()come questo Model::whereNotNull('column')->get();questo funziona bene per me.


-11

Se vuoi cercare record cancellati (Soft Deleted Record), non usare Eloquent Model Query. Usa invece Db :: table query ad es. Invece di usare Below:

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

Uso:

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

Questa risposta non ha nulla a che fare con la domanda. Oltre a ciò, non è necessario utilizzare Db::tableper trovare i record eliminati temporaneamente. Puoi filtrarli con il metodo withTrashed(), come viene detto nei documenti: laravel.com/docs/5.3/eloquent
— gvsrepins
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.