Éloquent - où pas égal à

110

J'utilise actuellement la dernière version de Laravel.

J'ai essayé les requêtes suivantes:

Code::where('to_be_used_by_user_id', '<>' , 2)->get()
Code::whereNotIn('to_be_used_by_user_id', [2])->get()
Code::where('to_be_used_by_user_id', 'NOT IN', 2)->get()

Idéalement, il devrait renvoyer tous les enregistrements sauf user_id = 2 , mais il renvoie un tableau vide. Comment résoudre ce problème?

Code::all()

Cela renvoie les 4 enregistrements.

Modèle de code:

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Code extends Model
{

    protected $fillable = ['value', 'registration_id', 'generated_for_user_id', 'to_be_used_by_user_id', 'code_type_id', 'is_used'];

    public function code_type()
    {
        return $this->belongsTo('App\CodeType');
    }

}
aBhijit
la source

Réponses:

216

Utiliser whereavec un !=opérateur en combinaison avecwhereNull

Code::where('to_be_used_by_user_id', '!=' , 2)->orWhereNull('to_be_used_by_user_id')->get()
Lukasgeiter
la source
1
Il ignore les enregistrements NULL. Si je change l'un des NULL en un identifiant non NULL autre que 2, cet enregistrement est renvoyé. Par «ça», je veux dire MySQL.
aBhijit le
Attention, c'est un piège.
Yevgeniy Afanasyev
23

Pour where field not emptycela a fonctionné pour moi:

->where('table_name.field_name', '<>', '')
Abduhafiz
la source
14

Bien que cela semble fonctionner

Code::query()
    ->where('to_be_used_by_user_id', '!=' , 2)
    ->orWhereNull('to_be_used_by_user_id')
    ->get();

vous ne devez pas l'utiliser pour de grandes tables, car en règle générale, "ou" dans votre clause where arrête la requête pour utiliser l'index. Vous passez de la "Recherche de clé" à la "Analyse complète de la table"

entrez la description de l'image ici entrez la description de l'image ici

Essayez plutôt Union

$first = Code::whereNull('to_be_used_by_user_id');

$code = Code::where('to_be_used_by_user_id', '!=' , 2)
        ->union($first)
        ->get();
Yevgeniy Afanasyev
la source
3

Ou comme ça:

Code::whereNotIn('to_be_used_by_user_id', [2])->get();
Mladen Janjetovic
la source
il ne récupère pas de données nulles
Imran Hossain