Formation PUB030 : Laravel, 2019 Les collections et tableaux

19.6 Vérifier si une collection de modèles contient une valeur donnée


Pendant le développement de votre application Laravel, vous pourriez arriver à un point où vous devez vérifier si une collection de modèles contient une valeur donnée.

Par exemple, prenons une collection de produits dont la description contient le mot « plastique ». Une telle collection peut être obtenue comme ceci :

Contrôleur Laravel (PHP)

$produits = Produit::where('description', 'LIKE', '%plastique%')->get();

Plus loin dans le code, vous pourriez vérifier si un code de produit donné fait partie de la liste des produits contenant le mot « plastique ».

Ex :

Contrôleur Laravel (PHP)

if (in_array($code, $produits->pluck('code')->toArray())) {

    ...

}

Une autre approche consiste à générer un tableau associatif et à rechercher dans les clés.

Ex :

Contrôleur Laravel (PHP)

if (!array_key_exists($code, $produits->pluck('description', 'code')->toArray())) {

    ...

}

pluck() vs relations Eloquent

Dans le cas où les données sont obtenues à partir de relations Eloquent, assurez-vous d'appliquer le pluck() sur une collection (propriété dynamique - sans parenthèses) et non sur un Builder (avec parenthèses). En effet, lorsque le pluck travaille avec un champ présent dans plus d'une table de la relation (ex : id), si le pluck() est appliqué sur un Builder, vous obtiendrez l'erreur « Integrity constraint violation: 1052 Column 'id' in field list is ambiguous ».

Par exemple, le code suivant fonctionnera correctement puisqu'il travaille avec une collection d'enseignants.

Contrôleur Laravel (PHP)

if (in_array($usager->id, $formation->enseignants->pluck('id')->toArray())) {

    ...

}

Mais celui-ci générera une erreur puisque le pluck() est appliqué sur un Builder d'enseignants et que le champ id existe dans plus d'une table de la relation.

Contrôleur Laravel (PHP)

if (in_array($usager->id, $formation->enseignants()->pluck('id')->toArray())) {

    ...

}

Notez que si le pluck() avait été appliqué sur un champ dont le nom n'est utilisé que dans une des tables de la relation, il aurait été correct, et même légèrement plus rapide, d'appliquer le pluck() sur un Builder (avec parenthèses).

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre