2016-06-05 1 views
0

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?

+0

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

+0

@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

Répondre

0

C'est parce que $ sélectionné n'est pas censé aborder cette façon

Alors comment ça se doit d'être pris en compte? Bien sûr, la réponse se trouve là même, puisque vous comptez sur $ selected pour vérifier quels tags ont été sélectionnés.

Selon votre commentaire, ce qui suit devrait résoudre votre problème

Changez si la condition de cette -

if($selected[$tag->id]) 

Pour ce -

if(array_in($tag->id, $selected)) 
+0

Cela n'aide pas, malheureusement. Le problème réside dans le fait qu'il n'y a pas de $ $ [$ tag-> id] ', $ selected' est juste un tableau commençant à 0, et n'est pas lié à l'ID. J'essaie de trouver un moyen de trouver si le '$ tag-> id' est dans l'objet' $ selected'. – Forest

+0

Veuillez vérifier la réponse mise à jour. J'espère que cela résout le problème. Vous pouvez vous référer à la documentation array_in() ici: http://php.net/manual/fr/function.in-array.php –

+0

Merci pour votre aide, mais malheureusement, cela ne fonctionnait pas parce que j'essayais des techniques de tableau et d'objets sur une collection Laravel. J'ai fait quelques recherches et découvert qu'il existe une méthode dédiée pour trouver ces données! – Forest

0

J'ai trouvé une solution de fonctionnement en utilisant la Collections API à Laravel, en utilisant contains.

if($selected != null && $selected->contains('id', $tag->id)) 

Cela semble être le moyen le plus pratique pour trouver les données, et il fonctionne parfaitement dans mon application.