合并多个使用相同id的对象

问题描述 投票:0回答:4

我正在尝试使用

Collection->merge()
合并多个对象(如收据、报告等)。

这是我使用的代码:

$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;
    });
php laravel laravel-4
4个回答
10
投票

我知道这是一个老问题,但我仍然会提供答案,以防有人像我一样通过搜索来到这里。

如果你尝试将两个不同的 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);

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


9
投票

我知道我碰到了一条 4 年前的帖子,但我遇到了这个,但没有一个答案是我想要的;所以,就像@Tadas一样,我将把我的答案留给遇到这个问题的人。彻底查看 laravel 5.5 文档后,我发现 concat 是首选方法。 因此,在OP的情况下,正确的解决方案是:

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

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

这样,如果某些字段相同,则报告集合中的每个元素将被附加到收据集合中的每个元素。 最终您可以对其进行洗牌以获得更具视觉吸引力的结果,例如一个观点:

$collection->shuffle();



2
投票
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);



0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.