2016-06-05 8 views
0

Ich habe eine Laravel-Datenbank mit einer Tabelle für tags, eine Tabelle für items und eine Tabelle für item_tag. Die Tags sind hierarchisch und als Ergebnis versuche ich herauszufinden, welche Tags innerhalb einer Schleife gesetzt wurden.Prüfen, ob etwas mit einer Laravel-Pivot-Tabelle eingestellt wurde

Das ist einfach, ich benutze einfach $item->tags und es gibt mir meine Tags in einem zugänglichen Objekt, bereit für die Schleife durch.

Das Problem tritt auf, wenn ich überprüfen möchte, ob ein bestimmtes Objekt eingestellt ist, wenn eine Liste von alle Tags angezeigt wird. Ich verwende den folgenden Code für die Prüfung:

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); 

Die erwartete Ausgabe wäre, dass jeder Tag, der so kühn in dem Baum kommen würde ausgewählt ist. Wenn das passiert wäre, würde ich das natürlich nicht veröffentlichen. Stattdessen wird nur das erste Element in der Struktur hervorgehoben, obwohl es nicht ausgewählt ist. (Das liegt daran, dass $selected auf diese Weise nicht angesprochen werden sollte).

Was ist der richtige Weg, um diese Informationen zu erhalten?

+0

Ich denke, es gibt ein paar grundlegende Ansätze, die Sie tun könnten. Tag :: get() gibt ein Collection-Objekt vom Typ "\ Illuminate \ Support \ Collection" zurück, das viele Funktionen besitzt, die Sie ausnutzen können. Vielleicht könnten Sie folgendes in Ihrer if-Klausel verwenden: $ selected-> where ('id', $ tag-> id) Sie könnten auch mit den Daten spielen, bevor Sie mit Ihrer Funktion beginnen. So etwas, abhängig von deiner Version von Laravel: Tag :: whereNull ('tag_id') -> get (['id']) -> zupfen ('id); – mattcrowe

+0

@mattcrowe Lustigerweise habe ich es herausgefunden, bevor ich deinen Kommentar bemerkt habe. Ich entdeckte, dass es viele Methoden gibt, die mit einer Sammlung verwendet werden können, und ich habe erfolgreich 'contains' verwendet, um mein Problem zu lösen. – Forest

Antwort

0

das, weil $ wird nicht angenommen, ausgewählt

dann diese Art und Weise angegangen werden, wie sie angegangen werden Got? Natürlich liegt die Antwort da selbst, da man sich darauf verlässt, dass $ ausgewählt wird, um zu überprüfen, welche Tags ausgewählt wurden.

Wie pro Ihren Kommentar, der Folgendes sollte Ihr Problem

ändern lösen, wenn die Bedingung von dieser -

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

Um dies -

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

Das hilft leider nicht. Das Problem liegt in der Tatsache, dass es kein '$ selected [$ tag-> id]' gibt, '$ selected' ist nur ein Array, das bei 0 beginnt und nicht mit der ID zusammenhängt. Ich versuche einen Weg zu finden, um herauszufinden, ob sich die '$ tag-> id 'im' $ selected' Objekt befindet. – Forest

+0

Bitte überprüfen Sie die aktualisierte Antwort. Hoffnung, die das Problem löst. Sie können sich hier auf die array_in() Dokumentation beziehen: http://php.net/manual/en/function.in-array.php –

+0

Vielen Dank für Ihre Hilfe, aber leider hat es nicht funktioniert, weil ich regelmäßige Array- und Objekttechniken auf einer Laravel-Sammlung versuchte. Ich habe etwas recherchiert und herausgefunden, dass es eine dedizierte Methode gibt, um diese Daten zu finden! – Forest

0

ich eine funktionierende Lösung gefunden die Verwendung von Collections API in Laravel, unter Verwendung contains.

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

Dies scheint der bequemste Weg, um die Daten zu finden, und es funktioniert perfekt in meiner Anwendung.

Verwandte Themen