Eloquente - dove non uguale a


110

Attualmente sto utilizzando l'ultima versione di Laravel.

Ho provato le seguenti query:

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

Idealmente, dovrebbe restituire tutti i record tranne user_id = 2, ma restituisce un array vuoto. Come lo affronto?

Code::all()

Ciò restituisce tutti e 4 i record.

Codice modello:

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

}

Risposte:


216

Utilizzare wherecon un !=operatore in combinazione conwhereNull

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

1
Ignora i record NULL. Se cambio uno dei NULL con un id non NULL diverso da 2, viene restituito quel record. Con "esso", intendo MySQL.
aBhijit

Stai attento, è una trappola.
Yevgeniy Afanasyev

23

Per where field not emptyquesto ha funzionato per me:

->where('table_name.field_name', '<>', '')

14

Mentre questo sembra funzionare

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

non dovresti usarlo per le tabelle grandi, perché come regola generale "o" nella tua clausola where interrompe la query per utilizzare index. Stai passando da "Ricerca chiave" a "scansione completa della tabella"

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Invece, prova Union

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

$code = Code::where('to_be_used_by_user_id', '!=' , 2)
        ->union($first)
        ->get();

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.