雄弁-等しくない場所


110

現在、最新のLaravelバージョンを使用しています。

私は次のクエリを試しました:

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

理想的には、 user_id = 2がありますが、空の配列を返します。これにどのように取り組むのですか?

Code::all()

これは4つのレコードすべてを返します。

コードモデル:

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

}

回答:


215

演算子と組み合わせて使用whereする!=whereNull

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

1
NULLレコードは無視されます。NULLの1つを2以外の非NULL IDに変更すると、そのレコードが返されます。「それ」とは、MySQLを意味します。
aBhijit 2015年

注意してください、それは罠です。
Yevgeniy Afanasyev


14

これはうまくいくようですが

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

大きなテーブルには使用しないでください。原則として、where句の「または」でインデックスを使用するクエリが停止されます。「キー検索」から「全表スキャン」に移行します

ここに画像の説明を入力してください ここに画像の説明を入力してください

代わりに、ユニオンを試してください

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.