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

}

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

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.