2016-05-29 10 views
3

Ich suche, ein Element in eine Laravel-Sammlung direkt nach einem anderen Element mit einem bestimmten Schlüssel einzufügen. Etwas wie:Wie wird ein Element in Laravel-Auflistung nach einem Element mit einem angegebenen Schlüssel eingefügt?

$collection->get(5)->insertAfter($someElement)

Die Reihenfolge ist wichtig, weil ich es zur Ausgabe von HTML verwendet werden später in der Ansicht. Ich habe die API durchgesehen und konnte keine geeignete Methode finden. Was ich mache, ist im Grunde ein Kommentar-System, und ich versuche, die Kommentare, die als Antwort auf andere Kommentare sind, direkt danach hinzuzufügen.

Ist das machbar? Ich benutze Laravel 4.2. Ich denke auch darüber nach, viele Spleiße zu machen und zu verschmelzen, aber das scheint, als wäre es wirklich furchtbar leistungsmäßig.

Irgendwelche Vorschläge? Vielen Dank.

+0

Wenn Auftrag für empfindliche ist, warum Sie verwenden 'sortBy' Methode nicht? – huuuk

+0

Ich würde 'parent_id' in der Kommentartabelle hinzufügen. Wenn der Benutzer also eine Antwort auf einen Kommentar hinterlässt, kann er als untergeordneter Teil des ersten Kommentars festgelegt werden, oder Sie können sich diese Pakete ansehen: [baum] (https://github.com/etrepat/baum) & [laravel-nestedset] (https://github.com/lazychaser/laravel-nestedset/) – Rifki

Antwort

3

Sie können ->splice() verwenden.
-Code wird wie folgt aussehen: $collection->splice(5, 0, [$someElement]);
Es wird $someElement in 6. Platz ein.


Laravel 5.2 Version

Wenn Sie müssen Element einfügen direkt nach Elemente mit id == 5, dann Sie haben für dieses Element zu suchen und dann gefunden Index verwenden, um neues Element einzufügen:

$index = $collection->search(function ($item, $key) { 
     return $item->id == 5; 
    }); 
    $collection->splice($index, 0, [$someElement]); 

Laravel Version 4.2

Leider Laravel 4.2 nicht Suchparameter als Verschluss akzeptieren, so müssen wir Index manuell finden:

$foundKey = null; 
    foreach ($collection->all() as $key => $item) { 
     if ($item->id == 5) { 
      $foundKey = $key; 
      break; 
     } 
    } 
    if($foundKey !== null) 
    { 
     $collection->splice($index, 0, [$someElement]); 
    } 
+0

Hmm, ich habe versucht, dies zu tun, aber $ index kam immer falsch. Selbst wenn ich das gemacht habe: ' $ index = $ collection-> search (funktion ($ item, $ key) { return true; }); ' Ich landete etwas anderes, wo ich foreach durch die Sammlung und dann generiert eine HTML-Zeichenfolge für jedes Element und an eine String-Variable anhängen. Danke für die Hilfe. Vielleicht, weil ich Laravel 4.2 benutze, dass $ collection-> search() nicht funktioniert hat? –

+1

@PhilYu Leider habe ich nicht bemerkt, dass Sie mit L4.2. Und ja, L4.2-Suche funktioniert ein bisschen anders, es akzeptiert keine Closures, nur Rohwert [L4.2 Suche] (https://github.com/laravel/framework/blob/4.2/src/Illuminate/Support /Collection.php#L480), [L5.2 Suche] (https://github.com/laravel/framework/blob/5.2/src/Illuminate/Support/Collection.php#L741) –

Verwandte Themen