2014-09-26 84 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();