Eloquent - 不等于
Eloquent - where not equal to
我目前使用的是最新的 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()
理想情况下,它应该 return 除 user_id = 2
之外的所有记录,但它 return 是空白数组。我该如何解决这个问题?
Code::all()
这 return 所有 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');
}
}
将 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();
你不应该将它用于大 tables,因为作为一般规则,你的 where 子句中的“或”停止查询以使用索引。您将从“密钥查找”转到“完整 table 扫描”
相反,尝试 Union
$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();
在 where 条件下使用 null 和 value 获取数据非常棘手。即使您直接使用 Where 和 OrWhereNotNull 条件,那么对于每一行,您都将获取这两个项目,而忽略其他条件(如果适用)。例如,如果您有更多的 where 条件,它将屏蔽掉那些并且仍然 return 具有 null 或 value 项,因为您使用了 orWhere 条件
到目前为止,我发现的最佳方法如下。这相当于 where (whereIn Or WhereNotNull)
Code::where(function ($query) {
$query->where('to_be_used_by_user_id', '!=' , 2)->orWhereNull('to_be_used_by_user_id');
})->get();
这是一个有用的范围方法,您可以将其添加到模型中并将其用于不同的列。
/**
* @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()
我目前使用的是最新的 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()
理想情况下,它应该 return 除 user_id = 2
之外的所有记录,但它 return 是空白数组。我该如何解决这个问题?
Code::all()
这 return 所有 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');
}
}
将 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();
你不应该将它用于大 tables,因为作为一般规则,你的 where 子句中的“或”停止查询以使用索引。您将从“密钥查找”转到“完整 table 扫描”
相反,尝试 Union
$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();
在 where 条件下使用 null 和 value 获取数据非常棘手。即使您直接使用 Where 和 OrWhereNotNull 条件,那么对于每一行,您都将获取这两个项目,而忽略其他条件(如果适用)。例如,如果您有更多的 where 条件,它将屏蔽掉那些并且仍然 return 具有 null 或 value 项,因为您使用了 orWhere 条件
到目前为止,我发现的最佳方法如下。这相当于 where (whereIn Or WhereNotNull)
Code::where(function ($query) {
$query->where('to_be_used_by_user_id', '!=' , 2)->orWhereNull('to_be_used_by_user_id');
})->get();
这是一个有用的范围方法,您可以将其添加到模型中并将其用于不同的列。
/**
* @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()