口才-不等于


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

}

Answers:


215

使用where!=结合运营商whereNull

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

1
它正在忽略NULL记录。如果我将NULL之一更改为除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();

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.