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.