我正在尝试使用
Collection->merge()
合并多个对象(如收据、报告等)。
这是我使用的代码:
$receipts = Receipt::all();
$reports = Report::all();
$collection = $receipts->merge($reports);
这是结果:
上面的屏幕截图显示了两个元素,但缺少第三个元素,因为它与第一个元素具有相同的 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;
});
我知道这是一个老问题,但我仍然会提供答案,以防有人像我一样通过搜索来到这里。
如果你尝试将两个不同的 Eloquent 集合合并为一个,并且某些对象碰巧具有相同的 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);
我知道我碰到了一条 4 年前的帖子,但我遇到了这个,但没有一个答案是我想要的;所以,就像@Tadas一样,我将把我的答案留给遇到这个问题的人。彻底查看 laravel 5.5 文档后,我发现 concat 是首选方法。 因此,在OP的情况下,正确的解决方案是:
$receipts = Receipt::all();
$reports = Report::all();
$collection = $receipts->concat($reports);
这样,如果某些字段相同,则报告集合中的每个元素将被附加到收据集合中的每个元素。 最终您可以对其进行洗牌以获得更具视觉吸引力的结果,例如一个观点:
$collection->shuffle();
方法将其中一个集合转换为基本集合。你可以在Illuminate\Support\Collection
找到它方法定义:
/**
* Get a base Support collection instance from this collection.
*
* @return \Illuminate\Support\Collection
*/
public function toBase()
{
return new self($this);
}
$receipts = Receipt::all();
$reports = Report::all();
$collection = $receipts->toBase()->merge($reports);
$list = array();
$list = array_merge($list, Receipt::all()->toArray());
$list = array_merge($list, Report::all()->toArray());