J'ai une base de données Laravel avec une table pour tags
, une table pour items
et une table pour item_tag
. Les balises sont hiérarchiques et, par conséquent, j'essaie de déterminer quelles balises ont été définies dans une boucle.Vérification si quelque chose est défini à l'aide d'un tableau croisé dynamique Laravel
C'est facile, j'utilise simplement $item->tags
et il me donne mes étiquettes dans un objet accessible, prêt à être bouclé.
Le problème apparaît lorsque je veux vérifier si un objet spécifique est défini, lors de l'affichage d'une liste de toutes les balises. J'utilise le code suivant pour les tests:
function buildTree($tags, $selected = null) {
echo "<ul>";
foreach($tags as $tag) {
echo "<li>";
if($selected[$tag->id]) {
echo "<strong>";
}
echo $tag->name;
if($selected[$tag->id]) {
echo "</strong>";
}
if($tag->children) {
buildTree($tag->children);
}
echo "</li>";
}
echo "</ul>";
}
$item = Item::find(1);
$tags = Tag::whereNull('tag_id')->get();
buildTree($tags, $item->tags);
Le résultat attendu serait que chaque balise sélectionnée monterait en gras dans l'arbre. Bien sûr, si cela s'était produit, je ne publierais pas cela. Au lieu de cela, il ne fait que mettre en évidence le premier élément de l'arborescence, même s'il n'est pas sélectionné. (C'est parce que $selected
n'est pas censé être adressée de cette façon).
Quelle est la bonne façon d'obtenir cette information?
Je pense qu'il y a quelques approches de base que vous pourriez faire. Tag :: get() retournera un objet de collection de type "\ Illuminate \ Support \ Collection" qui a beaucoup de fonctions que vous pouvez exploiter. Peut-être, vous pourriez utiliser ce qui suit dans votre clause if: $ selected-> where ('id', $ tag-> id) De plus, vous pouvez jouer avec les données avant de vous présenter à votre fonction. Quelque chose comme ceci, selon votre version de Laravel: Tag :: whereNull ('tag_id') -> get (['id']) -> pluck ('id); – mattcrowe
@mattcrowe Curieusement, je l'ai compris avant que je remarque votre commentaire. J'ai découvert qu'il existait de nombreuses méthodes pouvant être utilisées avec une collection, et j'ai réussi à utiliser 'contains' pour résoudre mon problème. – Forest