Eloquent – waar niet gelijk aan

Ik gebruik momenteel de nieuwste Laravel-versie.

Ik heb de volgende zoekopdrachten geprobeerd:

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

Idealiter zou het alle records moeten retourneren behalve user_id = 2, maar het retourneert een lege array. Hoe pak ik dit aan?

Code::all()

Hiermee worden alle 4 de records geretourneerd.

Codemodel:

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

Antwoord 1, autoriteit 100%

Gebruik wheremet een !=operator in combinatie met whereNull

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

Antwoord 2, autoriteit 11%

Voor where field not emptywerkte dit voor mij:

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

Antwoord 3, autoriteit 10%

Hoewel dit lijkt te werken

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

u zou het niet voor grote tabellen moeten gebruiken, omdat als algemene regel “of” in uw waar-clausule de query stopt om index te gebruiken. U gaat van “Key lookup” naar “full table scan”

voer hier de afbeeldingsbeschrijving invoer hier de afbeeldingsbeschrijving in

Probeer in plaats daarvan Union

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

Antwoord 4, autoriteit 3%

Of zoals dit:

Code::whereNotIn('to_be_used_by_user_id', [2])->get();

Antwoord 5

Gegevens ophalen met null en waarde op plaatsen waar de omstandigheden erg lastig zijn. Zelfs als u de rechte Where- en OrWhereNotNull-voorwaarde gebruikt, haalt u voor elke rij beide items op en negeert u andere waar-voorwaarden indien toegepast. Als u bijvoorbeeld meer waar-voorwaarden heeft, worden deze gemaskeerd en komt u toch terug met null- of waarde-items omdat u orWhere-voorwaarde heeft gebruikt

De beste manier die ik tot nu toe heb gevonden is als volgt. Dit werkt als waar (whereIn Or WhereNotNull)

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

Other episodes