使用运算符

时间:2016-02-17 19:51:34

标签: laravel eloquent

使用Eloquent模型查询时,我们使用

$modelInsatnce->where([$arrayContainingConditions])

使用=运算符选择为多列过滤的行。

对于使用单列上的自定义运算符进行过滤,我们使用

$modelInsatnce->where($column,$operator,$value)

如何使用没有链式调用的自定义运算符来过滤多个列?

2 个答案:

答案 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)