Laravel收集多个条件

时间:2017-06-01 12:43:52

标签: php laravel laravel-eloquent

点这篇文章How to create multiple where clause query using Laravel Eloquent?

我正在尝试插入多个'和'条件:

this.state.variants[0] === undefined

但是我收到了这个错误:

$matchThese = ['destination.country' => 'china', 'doc.description' => 'business'];

    return $collection->where($matchThese);

4 个答案:

答案 0 :(得分:15)

Collection where方法不接受像eloquent那样的一系列条件。但是你可以将多个条件链接起来。

return $collection->where('destination.country', 'china')
    ->where('doc.description', 'business');

实施例

$data = [
    ['name' => 'john', 'email' => 'john@gmail.com'],
    ['name' => 'john', 'email' => 'jim@gmail.com'],
    ['name' => 'kary', 'email' => 'kary@gmail.com'],
];

$collection = collect($data);

$result = $collection->where('name', 'john');
// [{"name":"john","email":"john@gmail.com"},{"name":"john","email":"jim@gmail.com"}]


$result = $collection->where('name', 'john')->where('email', 'john@gmail.com');
// [{"name":"john","email":"john@gmail.com"}]

答案 1 :(得分:1)

束缚多个where当然可以,但是您将为每个循环做一个循环。请改用filter。这将循环遍历,并只检查一次所有条件。

$matchThese = ['destination.country' => 'china', 'doc.description' => 'business'];

return $collection->filter(function ($item) use ($matchThese) {
    foreach ($matchThese as $key => $value) {
        if ($item[$key] !== $value) {
            return false;
        }
    }
    return true;
});

答案 2 :(得分:0)

由于where期望或需要多于一个参数,因此它不起作用。

这就是你的错误所说的:

  

函数where(),1传递的参数太少。 。 。但是有两个预期的

你可能会这样做:

return $collection->where($matchThese[0], $matchThese[1]);

或者这个

return $collection->where($matchThese[0], OPERATOR, $matchThese[1]); // OPERATOR could be `=` or `<>`

所以要有多个条件可以做这样的事情:

return $collection->where($matchThese[0], $matchThese[1])
                  ->where($foo, $bar);

你基本上可以将它们链接起来。

答案 3 :(得分:0)

这是我对这个问题的解决方案:

    $matchThese = ['country' => 'china', 'description' => 'business'];
    $data = collect([...]);
    $query = null;

    foreach ($matchThese as $col => $value) {
        $query = ($query ?? $data)->where($col, $value);
    }

在循环结束时,$query 将包含结果。