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

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

我想将多个集合合并为一个。我确实有一个解决方案,如下:

$allItems = $collection1->merge($collection2)
                        ->merge($collection3)
                        ->merge($collection4)
                        ->merge($collection5);

这实际上确实有效,但在某些或所有集合不包含对象的情况下我会遇到问题。我收到类似

call to merge() on non object
的错误。

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

如何优雅地迭代合并多个集合的过程,同时考虑到部分或全部集合可能为空或无效?赞赏!

php laravel laravel-4 foreach laravel-5
6个回答
50
投票

我最终将每个步骤分开。正是合并链杀死了它,因为部分或全部集合可能是无效的。

$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);

20
投票

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

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

$users = collect($clients)->merge($admins)->merge($anotherCollection)->merge(...);

17
投票

我使用了

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

$allItems = new \Illuminate\Database\Eloquent\Collection; 
$allItems = $allItems->concat($collection1);
$allItems = $allItems->concat($collection2);

这样做的原因是在合并时,它们将表的ID作为键。因此,如果两个表有两条具有相同表 id 的记录,

->merge()
将只向
$allItems
添加一条记录。但是
->concat()
将按其应有的方式添加两条记录。


2
投票

取决于你的数据,如果collection实际上是空的或者你的php支持它,你可以这样做:

    $allItems = $collection1->merge($collection2 ?: collect())
                    ->merge($collection3 ?: collect())
                    ->merge($collection4 ?: collect())
                    ->merge($collection5 ?: collect());

或者你想减少:

    $allItems = collect([$collection2, $collection3, $collection4])->reduce(function($arr, $item) {
        if (empty($item) || $item->isEmpty())
            return $arr;
        return $arr->merge($item);
    }, $collection1);

或纯 php 减少而无需开销

    $allItems = array_reduce([
        $collection2,
        $collection3,
        $collection4
    ], function($arr, $item) {
        if (empty($item) || $item->isEmpty())
            return $arr;
        return $arr->merge($item);
    }, $collection1);

-1
投票

您也可以尝试:

$allItems = collect([
  'collection_1_key' => $collection_1,
  'collection_2_key' => $collection_2,
  'collection_3_key' => $collection_3,
  'collection_4_key' => $collection_4,
]);

-1
投票

在 Laravel 中收集不同集合的简单方法是使用 add() 函数。

例如;让我们有 3 个表,即董事会、雇员、空缺。现在,如果我们想找回员工作为陪审团,他们必须属于空缺职位所属的董事会。但我们不知道该职位属于董事会下的哪位员工,因为可能同时有很多职位空缺。要获取每个空缺职位的董事会,请在 foreach 循环中循环遍历空缺职位。当您循环时,选择第一个项目的具有该董事会的员工,并合并其余的员工。

 $employees = null;
    if ($vacancies && $vacancies->isNotEmpty()) {
        foreach ($vacancies as $key => $vacancy) {
            if ($employees == null) {
                $employees = Employee::where([
                    'department_id' => $vacancy->directorate_id,
                ])->get();
            } else {
                $employee = Employee::where([
                    'department_id' => $vacancy->directorate_id,
                ])->get();

                if ($employee && $employee->isNotEmpty()) {
                    foreach ($employee as $emp) {
                        $employees->add($emp);
                    }
                }
            }
        }
    }

    dd($employees);

dump和die的输出

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