Несколько коллекций Laravel, где условия

После этого сообщения Как создать запрос с несколькими предложениями where с помощью Laravel Красноречивый?

Я пытаюсь вставить несколько условий «и»:

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

    return $collection->where($matchThese);

но я получаю эту ошибку:

Too few arguments to function Illuminate\Support\Collection::where(), 1 passed . . . but two expected

person Stefano Maglione    schedule 01.06.2017    source источник
comment
где ожидается два параметра, вы, вероятно, могли бы сделать что-то вроде этого return $collection-›where($matchThese[0], $matchThese[1]);   -  person utdev    schedule 01.06.2017


Ответы (4)


Метод Collection where не принимает массив условий, как это делает Eloquent. Но вы можете связать несколько условий where.

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

Пример

$data = [
    ['name' => 'john', 'email' => '[email protected]'],
    ['name' => 'john', 'email' => '[email protected]'],
    ['name' => 'kary', 'email' => '[email protected]'],
];

$collection = collect($data);

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


$result = $collection->where('name', 'john')->where('email', '[email protected]');
// [{"name":"john","email":"[email protected]"}]
person Sandeesh    schedule 01.06.2017
comment
Видя, насколько коллекции похожи на Eloquent, это не очевидно из документации Laravel. Спасибо! - person Jeffrey von Grumbkow; 20.11.2018
comment
это верно для и условия - person f_i; 13.02.2020

Цепочка нескольких where, безусловно, будет работать, но вы будете выполнять цикл для каждого из них. Вместо этого используйте фильтр. Это будет проходить и проверять все ваши условия только один раз.

$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;
});
person Guillaume Boutin    schedule 12.10.2018

Поскольку 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);

вы можете просто связать их.

person utdev    schedule 01.06.2017
comment
Он искал ответ, чтобы иметь несколько условий, а не правильный формат ввода. - person Jan Richter; 18.12.2017

Вот мое решение этой проблемы:

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

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

В конце цикла $query будет содержать результаты.

person phoenix    schedule 11.03.2021