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

}

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

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.