Elokwentny - jeśli nie jest równy

110

Obecnie używam najnowszej wersji Laravel.

Próbowałem następujących zapytań:

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

W idealnym przypadku powinno zwrócić wszystkie rekordy z wyjątkiem user_id = 2, ale zwraca pustą tablicę. Jak sobie z tym poradzić?

Code::all()

Zwraca wszystkie 4 rekordy.

Model kodu:

<?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
źródło

Odpowiedzi:

216

Używaj wherez !=operatorem w połączeniu zwhereNull

Code::where('to_be_used_by_user_id', '!=' , 2)->orWhereNull('to_be_used_by_user_id')->get()
lukasgeiter
źródło
1
Ignoruje NULL rekordy. Jeśli zmienię jedną z wartości NULL na jakiś inny niż NULL identyfikator inny niż 2, ten rekord jest zwracany. Przez „to” rozumiem MySQL.
aBhijit
Uważaj, to pułapka.
Yevgeniy Afanasyev
23

Na where field not emptyto zadziałało dla mnie:

->where('table_name.field_name', '<>', '')
Abduhafiz
źródło
14

Chociaż wydaje się, że działa

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

nie należy go używać do dużych tabel, ponieważ zgodnie z ogólną zasadą „or” w Twojej klauzuli where zatrzymuje zapytanie w celu użycia indeksu. Przechodzisz od „wyszukiwania klucza” do „pełnego skanowania tabeli”

wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj

Zamiast tego wypróbuj Union

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

$code = Code::where('to_be_used_by_user_id', '!=' , 2)
        ->union($first)
        ->get();
Yevgeniy Afanasyev
źródło
3

Lub tak:

Code::whereNotIn('to_be_used_by_user_id', [2])->get();
Mladen Janjetovic
źródło
nie pobiera zerowych danych
Imran Hossain