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.