如何在Laravel中正确合并多个集合

Mar*_*cel 14 php foreach laravel laravel-4 laravel-5

我想将多个集合合并为一个.我有一个解决方案,具体如下:

$allItems = $collection1->merge($collection2)
                        ->merge($collection3)
                        ->merge($collection4)
                        ->merge($collection5);
Run Code Online (Sandbox Code Playgroud)

这实际上确实有效,但是在部分或全部集合不包含任何对象的情况下,我遇到了问题.我得到了一个错误call to merge() on non object.

我实际上试图创建一个包含所有集合的数组,然后迭代它们,同时检查它们的有效性,但它不起作用,我觉得它不是很优雅.

我如何优雅地迭代这个合并多个集合的过程,同时考虑到部分或全部集合可能是空的还是无效的?不胜感激!

Mar*_*cel 22

我最终做的是分离每一步.合并链是杀死它,因为部分或全部集合可能无效.

$allItems = new \Illuminate\Database\Eloquent\Collection; //Create empty collection which we know has the merge() method
$allItems = $allItems->merge($collection1);
$allItems = $allItems->merge($collection2);
$allItems = $allItems->merge($collection3);
$allItems = $allItems->merge($collection4);
Run Code Online (Sandbox Code Playgroud)

  • 只是为了看到这个的人的更新你可以做`$ allItems = collect();`来创建一个新的集合. (8认同)
  • 如果您合并表集合,最好使用 `->concat($collection1)` 而不是 `->merge($collection1)` 因为两个表行具有来自不同表的相同 id,将显示 **merge** (3认同)
  • 你无法将这些链接起来很奇怪,但我可以确认这是正确的. (2认同)
  • 为什么我们不直接创建一个像这样的链“$allItems = $collection1->merge($collection2)->merge($collection3)”? (2认同)

Leo*_*hko 15

我有同样的问题,所以我通过以下方式解决了它:

$clients = ClientAccount::query()->get();
$admins = AdminAccount::query()->get();

$users = collect($clients)->merge($admins)->merge($anotherCollection)->merge(...);
Run Code Online (Sandbox Code Playgroud)


vim*_*uth 9

我用过,->merge()但遇到了一个小问题。所以我添加这个以防其他人面临同样的问题。->concat()是数据库集合合并的更好解决方案。

$allItems = new \Illuminate\Database\Eloquent\Collection; 
$allItems = $allItems->concat($collection1);
$allItems = $allItems->concat($collection2);
Run Code Online (Sandbox Code Playgroud)

这样做的原因是在合并时它们以表的 ID作为键。因此,如果两个表有两个具有相同表 ID 的->merge()记录,则只会将一条记录添加到$allItems. 但是->concat()会添加两条记录。