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
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]"}]
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.
Le chaînage de where
s 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;
});