首页 > 解决方案 > 如何在 Laravel Eloquent 中通过多个距离关系进行分组(通过急切加载的关系进行分组)

问题描述

我有一个如下的关系链: - 一个项目hasMany目标每个目标hasMany结果和每个结果hasMany输出然后每个输出belongsToir_indicator 和每个 ir_idicator belongsToir 和每个 irbelongsTo做。

我需要获得所有项目groupBy的名称,以便更仔细地了解我所使用的内容,结帐

    $ProjectsGroupedByDO = Project::has('objectives.outcomes.outputs.ir_indicator.ir.do')
->orderBy('created_at','desc')
->get()
->groupBy(function($d) {
         return $d->objectives->outcomes->outputs->ir_indicator->ir->do->name;
         }
    );

问题是->objectives, outcomes,outputs都是数组,因为hasMany它们之间的关系

如何将我的项目与由数组层组成的远距离关系分组?

注意:我在 OctoberCMS 上构建它

标签: laraveleloquentoctobercmslaravel-query-builder

解决方案


那不是groupBy()目的。您必须自己构建它:

$projects = Project::has('objectives.outcomes.outputs.ir_indicator.ir.do')->latest()->get();
$projectsGroupedByDO = new \Illuminate\Database\Eloquent\Collection;
foreach($projects as $project) {
    $outputs = $project->objectives->pluck('outcomes')->flatten()->pluck('outputs')->flatten();
    $names = $outputs->pluck('ir_indicator.ir.do.name');
    foreach($names as $name) {
        if(!isset($projectsGroupedByDO[$name])) {
            $projectsGroupedByDO[$name] = new \Illuminate\Database\Eloquent\Collection;
        }
        $projectsGroupedByDO[$name][] = $project;
    }
}

推荐阅读