2014-09-26 87 views
5

我試圖合併多個對象(如收據,報表等)與。合併使用相同ID的多個對象

這是我所使用的代碼:

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

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

這是結果:

enter image description here

上面截圖示出了兩個元件,但第三元素缺少,因爲它具有與第一個ID相同(id:「1」)。我試圖實現的是將它們全部三個顯示爲一個集合。

編輯:

我需要的結果是對象(集合),因爲我也對我的看法,我在那裏檢查類來確定顯示什麼用的代碼。另外,我使用這個函數對集合中的對象進行排序。

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

沒有任何理由說明這種合併不應該起作用。集合不依賴於項目的任何屬性。在'merge()'的引擎下,只是arrayable的array_merge。Report對象的外觀如何? – tomvo 2014-09-26 14:23:16

回答

0

您可以將所有集合放在一個數組中並使用它。取決於你想要對收藏做什麼。

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

請參閱我的編輯。我也嘗試過,但我需要的結果是雄辯的對象。 – user3811576 2014-09-26 12:10:06

4

我知道這是一個老問題,但我仍然會提供以防萬一有人來這裏從搜索像我一樣的答案。

如果您嘗試將兩個不同的雄辯集合合併爲一個,並且某些對象碰巧擁有相同的ID,則會覆蓋另一個。我不知道爲什麼會這樣做,如果這是一個錯誤或一個功能 - 需要更多的研究。要解決這個問題,只需使用push()方法,或者重新考慮解決問題的方法以避免這種情況。問題的

例子:

$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 

一個可能的解決方案:

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

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

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

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

2

我知道我撞上一個4歲線程,但我遇到了這個沒有一個答案是我想要的;所以,就像@Tadas一樣,我會爲遇到這個問題的人留下我的回答。在仔細查看laravel 5.5文檔後,我發現concat是首選方法。 所以,在OP的情況下,正確的解決辦法是:

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

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

這樣報告集合中的每個元素將被追加到回執集合中的每個元素,事件,如果某些字段是相同的。

最終你可以洗牌,以獲得更具視覺吸引力的結果,例如,一個視圖:

$collection->shuffle(); 
相關問題