2015-09-04 16 views
8

Tôi muốn hợp nhất nhiều bộ sưu tập thành một. Tôi có một giải pháp, đó là những điều sau đây:Cách hợp nhất nhiều bộ sưu tập vào Laravel

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

Điều này thực sự có tác dụng, nhưng tôi gặp vấn đề trong trường hợp một số hoặc tất cả các bộ sưu tập không chứa đối tượng. Tôi gặp lỗi dọc theo các dòng call to merge() on non object. Tôi thực sự đã cố gắng tạo một mảng của tất cả các bộ sưu tập, và sau đó lặp lại chúng, trong khi kiểm tra tính hợp lệ của chúng, nhưng nó không hoạt động và tôi cảm thấy nó không phải là rất thanh lịch.

Làm cách nào tôi có thể lặp lại thanh lịch thông qua quá trình hợp nhất nhiều bộ sưu tập này, trong khi tính đến một số hoặc tất cả các bộ sưu tập có thể trống hoặc không hợp lệ? Đánh giá cao!

Trả lời

11

Điều tôi đã làm gần đây là tách từng bước. Đó là chuỗi kết hợp đã giết chết nó, bởi vì một số hoặc tất cả các bộ sưu tập có thể đã không hợp lệ.

$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

Thật kỳ lạ khi bạn không thể chuỗi những thứ này, nhưng tôi có thể xác nhận rằng điều này là chính xác. – mopo922

+2

Chỉ cần cập nhật cho những người thấy điều này bạn có thể làm '$ allItems = collect();' để tạo một bộ sưu tập mới. –

0

phụ thuộc vào dữ liệu của bạn, nếu bộ sưu tập thực sự là null hoặc hỗ trợ php của bạn nó, bạn có thể làm:

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

hoặc bạn muốn làm một giảm:

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

hoặc đồng bằng php giảm mà không trên không

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

Thật không may này không đưa vào tài khoản thực tế là một số hoặc tất cả các bộ sưu tập có thể là không hợp lệ, incluing $ collection1 – Marcel

1

Tôi có cùng một câu hỏi, vì vậy tôi giải quyết nó theo cách sau:

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

$users = collect($clients)->merge($admins)->merge($anotherCollection)->merge(...); 
Các vấn đề liên quan