web-dev-qa-db-fra.com

Laravel collection multiple où conditions

Suite à ce post Comment créer plusieurs requêtes où clause en utilisant Laravel Eloquent?

J'essaie d'insérer plusieurs 'et' conditions:

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

    return $collection->where($matchThese);

mais je reçois cette erreur:

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

La méthode Collection where n'accepte pas un tableau de conditions comme le fait éloquent. Mais vous pouvez enchaîner plusieurs conditions où.

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

Exemple

$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]"}]
12
Sandeesh

Puisque where attend ou a besoin de plus d’un paramètre, cela ne fonctionne pas.

C'est ce que dit votre erreur:

Trop peu d'arguments pour fonctionner où (), 1 a été transmis. . . mais deux attendus

Vous pourriez probablement faire quelque chose comme ça:

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

Ou ca

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

Donc, pour avoir plusieurs conditions où l'on peut faire quelque chose comme ceci:

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

vous pouvez simplement les chaîner.

0
utdev

Le chaînage de wheres multiples fonctionnera sûrement, mais vous ferez une boucle pour chacun d’eux. Utilisez filter à la place. Cela fera une boucle et vérifiera toutes vos conditions une seule fois.

$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;
});
0
Guillaume Boutin