2014-09-26 11 views
5

Sto tentando di unire più oggetti (come Ricevute, Rapporti, ecc.) Con .Unione di più oggetti che utilizza lo stesso ID

Questo è il codice che ho usato:

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

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

Questo è il risultato:

enter image description here

La schermata sopra mostra due elementi, ma il terzo elemento è mancante perché ha lo stesso id (id: "1") come primo. Quello che sto cercando di ottenere è di mostrarli tutti e tre come collezione.

EDIT:

ho bisogno il risultato di essere oggetti (raccolta) perché anche io uso il codice sul mio punto di vista, in cui posso controllare la classe per determinare cosa visualizzare. Inoltre, io uso questa funzione per ordinare gli oggetti nella collezione.

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

Non c'è alcun motivo per cui questa unione non dovrebbe funzionare. La raccolta non dipende da nessuna delle proprietà degli articoli. Under the hood 'merge()' è solo un 'array_merge' di elementi arrayable.Come appare l'oggetto Report? – tomvo

risposta

0

È possibile inserire tutte le raccolte in un array e utilizzarlo. Dipende da cosa vuoi fare con la collezione.

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

per favore vedi la mia modifica. L'ho provato anche io, ma ho bisogno che i risultati siano oggetti eloquenti. – user3811576

4

So che questa è una vecchia questione, ma sarà ancora fornire la risposta nel caso in cui qualcuno viene qui dalla ricerca come ho fatto io.

Se si tenta di unire due raccolte eloquenti diverse in uno e alcuni oggetti hanno lo stesso id, uno sovrascriverà l'altro. Non so perché lo faccia e, se questo è un bug o una funzionalità, sono necessarie ulteriori ricerche. Per risolvere questo problema basta usare il metodo push() o ripensare l'approccio al problema per evitarlo.

Esempio di un problema:

$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 

Una possibile soluzione:

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

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

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

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

2

so che sto urtando un filo di 4 anni, ma mi sono imbattuto in questo e nessuna delle risposte era ciò che stavo cercando; quindi, come @Tadas, lascerò la mia risposta per le persone che si imbatteranno in questo. Dopo aver esaminato a fondo la documentazione di laravel 5.5, ho trovato che concat era il metodo go-to. Quindi, nel caso del PO la soluzione corretta sarebbe:

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

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

In questo modo ogni elemento della collezione relazione verrà aggiunto alla ogni elemento della collezione ricevute, evento se alcuni campi sono identici.

Infine, è possibile mischiarlo per ottenere un risultato visivo più accattivante per es. a view:

$collection->shuffle(); 
Problemi correlati