2015-09-04 14 views
8

Chcę scalić wiele kolekcji w jedną kolekcję. Mam rozwiązanie, które jest następujące:Jak prawidłowo scalić wiele kolekcji w Laravel

$allItems = $collection1->merge($collection2) 
         ->merge($collection3) 
         ->merge($collection4) 
         ->merge($collection5); 

To faktycznie działa, ale napotkasz problemy w przypadkach, w których niektóre lub wszystkie z kolekcji zawierają żadnych obiektów. Otrzymuję błąd zgodny z call to merge() on non object.

Tak naprawdę próbowałem stworzyć tablicę wszystkich kolekcji, a następnie sprawdzałem je, sprawdzając ich ważność, ale to nie zadziałało i uważam, że nie było to zbyt eleganckie.

Jak mogę elegancko powtarzać ten proces łączenia wielu kolekcji, biorąc pod uwagę, że niektóre lub wszystkie kolekcje mogą być puste lub nieprawidłowe? Doceniony!

Odpowiedz

11

To co zrobiłem, to oddzielanie każdego kroku. To łańcuchowe połączenie zabijało, ponieważ niektóre lub wszystkie zbiory mogły być nieważne.

$allItems = new \Illuminate\Database\Eloquent\Collection; //Create empty collection which we know has the merge() method 
$allItems = $allItems->merge($collection1); 
$allItems = $allItems->merge($collection2); 
$allItems = $allItems->merge($collection3); 
$allItems = $allItems->merge($collection4); 
+1

To dziwne, że nie możesz ich połączyć, ale mogę potwierdzić, że to prawda. – mopo922

+2

Po prostu aktualizacja dla osób widzących to można zrobić '$ allItems = collect() ;, aby utworzyć nową kolekcję. –

0

zależy od danych, jeśli zbiór jest właściwie zerowa lub Twój wsparcie to PHP można zrobić:

$allItems = $collection1->merge($collection2 ?: collect()) 
        ->merge($collection3 ?: collect()) 
        ->merge($collection4 ?: collect()) 
        ->merge($collection5 ?: collect()); 

lub chcesz zrobić redukuj:

$allItems = collect([$collection2, $collection3, $collection4])->reduce(function($arr, $item) { 
     if (empty($item) || $item->isEmpty()) 
      return $arr; 
     return $arr->merge($item); 
    }, $collection1); 

lub zwykły php zmniejszyć bez napowietrzne

$allItems = array_reduce([ 
     $collection2, 
     $collection3, 
     $collection4 
    ], function($arr, $item) { 
     if (empty($item) || $item->isEmpty()) 
      return $arr; 
     return $arr->merge($item); 
    }, $collection1); 
+0

Niestety te nie biorą pod uwagę faktu, że niektóre lub wszystkie zbiory mogłyby być nieważne, incluing $ collection1 – Marcel

1

Miałem to samo pytanie, więc rozwiązać go w następujący sposób:

$clients = ClientAccount::query()->get(); 
$admins = AdminAccount::query()->get(); 

$users = collect($clients)->merge($admins)->merge($anotherCollection)->merge(...); 
Powiązane problemy