É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');
    }

}

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()

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', '<>', '')

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();

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.