使用Eloquent模型查询时,我们使用
$modelInsatnce->where([$arrayContainingConditions])
使用=
运算符选择为多列过滤的行。
对于使用单列上的自定义运算符进行过滤,我们使用
$modelInsatnce->where($column,$operator,$value)
如何使用没有链式调用的自定义运算符来过滤多个列?
答案 0 :(得分:3)
where
函数可以采用数组。来自Laravel API:
public function where($column, $operator = null, $value = null, $boolean = 'and')
{
// If the column is an array, we will assume it is an array of key-value pairs
// and can add them each as a where clause. We will maintain the boolean we
// received when the method was called and pass it into the nested where.
if (is_array($column)) {
return $this->addArrayOfWheres($column, $boolean);
}
然后是addArrayOfWheres
函数:
protected function addArrayOfWheres($column, $boolean)
{
return $this->whereNested(function ($query) use ($column) {
foreach ($column as $key => $value) {
if (is_numeric($key) && is_array($value)) {
call_user_func_array([$query, 'where'], $value);
} else {
$query->where($key, '=', $value);
}
这会查找带有数组值的数字键,然后使用值数组调用->where()
。如果它是一个关联数组,它会假设=
为运算符,如您所说。但是如果你传递一个标准数组,它会在每个记录的查询上调用where
,使用三个数组值作为参数:
$query->where([
['foo','!=',0],
['bar','<',5]
]);
另请注意,您可以传递和/或作为第4个参数:
$query->where([
['foo','!=',0],
['bar','<',5]
], null, null, 'or');
API链接:https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Query/Builder.php#L449
答案 1 :(得分:0)
Jeff的回答很有帮助,但在我的情况下不起作用。 因此,我将“或”移至内部数组的第四个参数。 在Laravel 5.5-5.6上进行了测试。
$query->where([
['foo', 'like', '%something%'],
['bar', '<', 5, 'or'] // <-- HERE
]);
它将导致:
WHERE (`foo` LIKE '%something%' OR `bar` < 5)