Beredsam - wo nicht gleich

110

Ich verwende derzeit die neueste Laravel-Version.

Ich habe folgende Abfragen versucht:

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

Im Idealfall sollten alle Datensätze außer zurückgegeben werden user_id = 2, es wird jedoch ein leeres Array zurückgegeben. Wie gehe ich das an?

Code::all()

Dies gibt alle 4 Datensätze zurück.

Codemodell:

<?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
quelle

Antworten:

214

Verwendung wheremit einem !=Bediener in Kombination mitwhereNull

Code::where('to_be_used_by_user_id', '!=' , 2)->orWhereNull('to_be_used_by_user_id')->get()
lukasgeiter
quelle
1
NULL-Datensätze werden ignoriert. Wenn ich einen der NULL-Werte in eine andere Nicht-NULL-ID als 2 ändere, wird dieser Datensatz zurückgegeben. Mit "es" meine ich MySQL.
aBhijit
Sei vorsichtig, es ist eine Falle.
Jewgenij Afanasjew
23

Dafür where field not emptyhat bei mir funktioniert:

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

Während dies zu funktionieren scheint

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

Sie sollten es nicht für große Tabellen verwenden, da "oder" in Ihrer where-Klausel in der Regel die Abfrage zur Verwendung des Index stoppt. Sie wechseln von "Key Lookup" zu "Full Table Scan".

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Versuchen Sie stattdessen Union

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

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

Oder so:

Code::whereNotIn('to_be_used_by_user_id', [2])->get();
Mladen Janjetovic
quelle
Es werden keine Nulldaten abgerufen
Imran Hossain