2014-09-26 26 views
5

Ich versuche, mehrere Objekte zu verschmelzen (wie Quittungen, Berichte, usw.) mit .Zusammenführen mehrerer Objekte, die gleiche ID verwendet

Dies ist der Code, den ich verwendet:

$receipts = Receipt::all(); 
$reports = Report::all(); 

$collection = $receipts->merge($reports); 

Dies ist das Ergebnis:

enter image description here

Die obige Abbildung zeigt zwei Elemente, aber das dritte Element fehlt, weil es die gleiche ID (id: "1") wie die erste. Was ich versuche, ist es, alle drei als eine Sammlung darzustellen.

EDIT:

Ich brauche die Ergebnisobjekte zu sein (Sammlung), weil ich auch den Code auf meiner Ansicht verwenden, wo ich die Klasse überprüfen, um zu bestimmen, was angezeigt werden soll. Außerdem verwende ich diese Funktion, um die Objekte in der Sammlung zu sortieren.

$collection->sort(function($a, $b) 
    { 
     $a = $a->created_at; 
     $b = $b->created_at; 
     if ($a === $b) { 
      return 0; 
     } 
     return ($a > $b) ? 1 : -1; 
    }); 
+0

Es gibt keinen Grund, warum diese Zusammenführung nicht funktionieren sollte. Die Sammlung hängt nicht von den Eigenschaften der Elemente ab. Unter der Haube ist 'merge()' nur eine 'array_merge' von arrayfähigen Elementen.Wie sieht das Berichtsobjekt aus? – tomvo

Antwort

0

Sie könnten alle Sammlungen in ein Array setzen und diese verwenden. Hängt davon ab, was Sie mit der Sammlung machen möchten.

$list = array(); 
$list = array_merge($list, Receipt::all()->toArray()); 
$list = array_merge($list, Report::all()->toArray()); 
+0

siehe meine Bearbeitung. Ich habe das auch versucht, aber ich brauche die Ergebnisse, um beredte Objekte zu sein. – user3811576

4

Ich weiß, dass dies eine alte Frage ist, aber ich werde noch bietet die Antwort nur für den Fall jemand hier aus der Suche kommt wie ich.

Wenn Sie versuchen, zwei verschiedene eloquent Sammlungen zu einem verschmelzen und einige Objekte passieren die gleiche ID haben, wird eine die andere überschreiben. Ich weiß nicht, warum es das tut und ob das ein Bug oder ein Feature ist - mehr Forschung benötigt. Um dies zu beheben, verwenden Sie stattdessen die Methode push(), oder überdenken Sie Ihre Vorgehensweise, um dies zu vermeiden.

Beispiel eines Problems:

$cars = Car::all(); 
$bikes = Bike::all(); 
$vehicles = $cars->merge($bikes); 
// if there is a car and a bike with the same id, one will overwrite the other 

Eine mögliche Lösung:

$collection = collect(); 
$cars = Car::all(); 
$bikes = Bike::all(); 

foreach ($cars as $car) 
    $collection->push($car); 

foreach ($bikes as $bike) 
    $collection->push($bike); 

Quelle: https://medium.com/@tadaspaplauskas/quick-tip-laravel-eloquent-collections-merge-gotcha-moment-e2a56fc95889

2

Ich weiß, ich bin ein 4 Jahre alten Thread zu stoßen, aber ich kam in dieser und keine der Antworten war was ich suchte; Also, wie @Tadas, überlasse ich meine Antwort für Leute, die darauf stoßen werden. Nach dem Betrachten der Laravel 5.5 Dokumentation gründlich fand ich, dass concat die Go-to-Methode war. So im Fall des OP die richtige Lösung wäre:

$receipts = Receipt::all(); 
$reports = Report::all(); 

$collection = $receipts->concat($reports); 

Auf diese Weise jedes Element im Bericht Sammlung jedes Element in der Receipts Sammlung, Veranstaltung angehängt wird, wenn einige Felder identisch sind.

Schließlich konnte man mischt es ein visuelles ansprechendes Ergebnis für beispielsweise zu erhalten eine Ansicht:

$collection->shuffle(); 
Verwandte Themen