雄辩-在不等于

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


}
465944 次浏览

使用 where!=操作符结合使用 whereNull

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

where field not empty来说,这对我很有用:

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

虽然这看起来很有效

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

您不应该对大表使用它,因为作为一般规则“ or”,在 where 子句中停止查询以使用 index。你从“键查找”到“全表扫描”

enter image description hereenter image description here

相反,试试 工会

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


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

或者像这样:

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

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

到目前为止,我找到的最好的方法如下

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

下面是一个有用的 scope 方法,您可以将其添加到模型中,并将其用于不同的列。

/**
* @param Builder $query
* @param string $field
* @param $value
* @return Builder
*/
public function scopeWhereNot(Builder $query, string $field, $value): Builder
{
return $value === null
? $query->whereNotNull($field)
: $query->where(function ($q) use ($field, $value) {
return $q->where($field, '<>', $value)
->orWhereNull($field);
});
}

并按如下方式使用它

Code::whereNot('to_be_used_by_user_id', 2)->get()