Comment vérifier «si non nul» avec Eloquent?

218

Comment vérifier si un champ n'est pas nul avec Eloquent?

J'ai essayé Model::where('sent_at', 'IS NOT', DB::raw('null'))->...mais ça donne IS NOTcomme reliure au lieu d'une comparaison.

Voici ce qui en DB::getQueryLog()dit:

  '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
la source
Vous pouvez essayer d'utiliser !=au lieu de IS NOT.
JaTochNietDan
1
@JaTochNietDan L'opérateur! = Ne fonctionne pas avec les valeurs NULL. Selon la documentation MySQL : "Vous ne pouvez pas utiliser d'opérateurs de comparaison arithmétique tels que =, <ou <> pour tester NULL."
Soulriser

Réponses:

402

Eloquent a une méthode pour cela (Laravel 4. * / 5. *);

Model::whereNotNull('sent_at')

Laravel 3:

Model::where_not_null('sent_at')
Bas
la source
1
J'ai besoin de vérifier le champ null at supprimé, j'ai donc changé cela en whereNull('deleted_at')et j'ai fait exécuter ma requête.
Tarunn
7
Une autre fonctionnalité non documentée. Eh bien, à moins que vous ne comptiez les documents de l'API, mais la documentation principale de Laravel n'en fait aucune mention.
aross
12
La whereNotNull()méthode (et plusieurs autres non documentées précédemment) a été ajoutée à la documentation de la version 5.1: laravel.com/docs/5.1/queries#where-clauses .
Ben Johnson
@aross mais dans Query Builder, pas dans Eloquent (Laravel 5.1)
pmiranda
@pmiranda ne sais pas ce que tu veux dire, mais mon commentaire était il y a 4 ans et à propos de Laravel 4, de nos jours nous sommes à Laravel 6. Je suppose que la situation a changé. Bien que la documentation principale de Laravel ne soit pas encore très complète, elle ressemble plus à un tas de guides.
aross
20

Si quelqu'un comme moi veut le faire avec le générateur de requêtes dans Laravel 5.2.23, cela peut être fait comme ->

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

Ou avec portée dans le modèle:

public function scopeNotNullOnly($query){

    return $query->where('status_message', '<>', '');
}
Atiqur
la source
1
que 'and'signifie
senty
1
En fait, ici 'et' ne fait rien, mais ce serait le cas si le premier paramètre était un tableau. Voici le prototype de la méthode: public function where($column, $operator = null, $value = null, $boolean = 'and'); et l'emplacement -".....\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php"
Atiqur
9

Si vous souhaitez utiliser la façade DB :

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

Jon
la source
4

On peut utiliser

Model::whereNotNull('sent_at');

Ou

Model::whereRaw('sent_at is not null');
srmilon
la source
4

Je vois que cette question est un peu ancienne mais je l'ai rencontrée à la recherche d'une réponse. Bien que je n'aie pas réussi avec les réponses ici, je pense que cela pourrait être parce que je suis sur PHP 7.2 et Laravel 5.7.ou possible parce que je jouais avec des données sur la CLI en utilisant Laravel Tinker.

J'ai essayé des choses qui ont fonctionné pour moi et pour d'autres, mais qui, je l'espère, aideront les autres.


Je n'ai pas réussi à courir:

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

Tout ce qui précède a renvoyé un tableau vide pour moi


J'ai cependant réussi à courir:

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

Cela a renvoyé tous les résultats dans un tableau comme je m'y attendais. Remarque: vous pouvez supprimer le all()et récupérer une Illuminate \ Database \ Eloquent \ Collection au lieu d'un tableau si vous préférez.

Rockin4Life33
la source
0

dans laravel 5.4 ce code Model::whereNotNull('column')ne fonctionnait pas, vous devez ajouter get()comme celui-ci Model::whereNotNull('column')->get();celui-ci fonctionne bien pour moi.

Cardage Ermita Sungkit
la source
-11

Si vous souhaitez rechercher un enregistrement supprimé (enregistrement supprimé en douceur), n'utilisez pas Eloquent Model Query. Utilisez plutôt la requête Db :: table, par exemple, au lieu d'utiliser ci-dessous:

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

Utilisation:

$stu = DB::table('students')->where('rollNum', '=', $newRollNo)->first();
user4397894
la source
Cette réponse n'a rien à voir avec la question. En plus de cela, vous n'avez pas besoin d'utiliser Db::tablepour trouver les enregistrements supprimés. Vous pouvez les filtrer avec la méthode withTrashed(), comme cela est dit dans les documents: laravel.com/docs/5.3/eloquent
gvsrepins