【问题标题】:How to groupBy() Eloquent collection by column?如何按列 groupBy() Eloquent 集合?
【发布时间】:2021-04-10 18:02:37
【问题描述】:

我有一个程序表,它指的是位置、专业、年级、类型表。我想根据它们的位置将程序分组到专业和类型集合。我可以按 garde_id 对它们进行分组,但我想要一个等级名称而不是等级 ID。

$programs = Program::whereLocation_id($location->id)
    ->with('location', 'department', 'major', 'grade')
    ->latest()->get();

$programs->groupBy('grade_id');

结果

[
    1 => ['department-name','major-name','title'],
    2 => ['department-name','major-name','title']
]

预期

[
  'phd' => ['department-name','major-name','title'],
  'M.S' => ['department-name','major-name','title']
]

在 Eloquent 中完成此任务的最佳查询是什么?

【问题讨论】:

    标签: php laravel collections eloquent


    【解决方案1】:

    您的情况的另一种解决方案是:

    $grouped = $programs->groupBy(function ($item, $key) {
        return $item['grade']->name; // Setting grade name as key
    });
    

    【讨论】:

    • 这个解决方案不起作用,因为我们在我们有grade_id的项目中没有“评分”
    • @Peymanabdollahy 你添加了“等级”关系->with('location', 'department', 'major', 'grade'),所以我认为 $item['grade'] 或 $item->grade 应该给你。
    • 嗯,但事实并非如此。似乎 groupBy 不适用于关系项。
    【解决方案2】:

    您可以从成绩中检索程序,您将获得预期的结果。 我猜 Grade 模型中的关系名称叫做“programs”

    $locationId = $location->id;
    $grades = Grade::whereHas('programs', function($query) use ($locationId) {
        $query->where('location_id', $locationId);
    })->with(['programs' => function ($query) use ($locationId) {
        $query->where('location_id', $locationId);
        $query->with('location','department','major');
    
        return $query;
    }])->get();
    

    您将拥有一系列成绩,每个成绩中都有自己的课程。 您还可以按年级名称分组:

    $grades->groupBy('name');
    

    【讨论】:

    • 这似乎是一种工作,我会测试它并让其他人知道。感谢您的回复。
    • 这个查询有一个问题,它返回所有的成绩,甚至是没有任何课程的成绩。我想删除它们。
    • @Peymanabdollahy 再次检查答案。我在查询中添加了“whereHas”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多