雄辩 - 不等于

时间:2015-01-31 21:51:27

标签: laravel eloquent

我目前正在使用最新的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');
    }

}

5 个答案:

答案 0 :(得分:151)

where!=运算符结合使用whereNull

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

答案 1 :(得分:15)

where field not empty这对我有用:

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

答案 2 :(得分:1)

这似乎可行

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

您不应将其用于大表,因为通常情况下,where子句中的“或”将停止使用索引的查询。您将从“键查找”变为“全表扫描”

enter image description here enter image description here

相反,请尝试Union

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

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

答案 3 :(得分:0)

或者这样:

Code::whereNotIn('to_be_used_by_user_id', [2])->get();

答案 4 :(得分:0)

在条件非常棘手的地方获取具有null和value的数据。即使您使用直接的Where和OrWhereNotNull条件,对于每行,您也会获取这两个项目,而忽略其他where条件(如果应用)。例如,如果您有更多where条件,它将屏蔽掉这些条件,并仍然返回null或value项,因为您使用了orWhere条件

到目前为止,我发现的最好方法如下。它作为where(whereIn或WhereNotNull)

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