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

时间:2014-09-26 11:52:34

标签: laravel laravel-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;
    });

4 个答案:

答案 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

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

答案 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);