我尝试将多个对象(如收据,报告等)与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;
});
答案 0 :(得分:5)
我知道这是一个老问题,但我仍然会提供答案,以防有人像我一样从搜索到这里来。
如果您尝试将两个不同的雄辩集合合并为一个,并且某些对象碰巧具有相同的ID,则会覆盖另一个。我不知道为什么会这样做,如果这是一个错误或一个功能 - 需要更多的研究。要解决这个问题,只需使用push()方法,或者重新考虑解决问题的方法以避免这种情况。
问题示例:
$(".footer-contact input[type=text], .footer-contact textarea").each(function(){
this.value = "";
});
可能的解决方案:
$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
答案 1 :(得分:3)
我知道我正在碰到一个4岁的线程,但我遇到了这个问题,没有一个答案是我正在寻找的;所以,就像@Tadas一样,我会给那些会遇到这个问题的人留下我的答案。在仔细查看laravel 5.5文档之后,我发现concat是最常用的方法。 因此,在OP的情况下,正确的解决方案是:
$receipts = Receipt::all();
$reports = Report::all();
$collection = $receipts->concat($reports);
这样报告集合中的每个元素都会附加到收据集合中的每个元素,如果某些字段相同则为事件。
最终你可以将其改组以获得更具视觉吸引力的结果,例如:观点:
$collection->shuffle();
答案 2 :(得分:0)
您可以将所有集合放在一个数组中并使用它。取决于你想要对该系列做什么。
$list = array();
$list = array_merge($list, Receipt::all()->toArray());
$list = array_merge($list, Report::all()->toArray());
答案 3 :(得分:0)
另一种解决方法是使用 toBase()方法将您的一个收藏夹转换为基本收藏夹。您可以在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);