Eloquent - eşit olmadığı yerde


110

Şu anda en son Laravel sürümünü kullanıyorum.

Aşağıdaki sorguları denedim:

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

İdeal olarak, dışındaki tüm kayıtları döndürmelidir user_id = 2, ancak boş dizi döndürür. Bununla nasıl başa çıkacağım?

Code::all()

Bu 4 kaydın tümünü döndürür.

Kod modeli:

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

}

Yanıtlar:


216

whereBir !=operatörle birlikte kullanınwhereNull

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

1
NULL kayıtları görmezden geliyor. NULL'lardan birini 2 dışında NULL olmayan bir id ile değiştirirsem, bu kayıt döndürülür. "O" derken MySQL'i kastediyorum.
aBhijit

Dikkatli olun, bu bir tuzaktır.
Yevgeniy Afanasyev

23

İçin where field not emptybu benim için çalıştı:

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

14

Bu işe yarıyor gibi görünürken

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

bunu büyük tablolar için kullanmamalısınız, çünkü genel bir kural olarak "veya" nerede cümlenizde indeksi kullanmak için sorguyu durduruyor. "Anahtar arama" dan "tam tablo taraması" na geçiyorsunuz

görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin

Bunun yerine, denemek Birliği

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.