Laravel 按 Eloquent 关系分组

Posted

技术标签:

【中文标题】Laravel 按 Eloquent 关系分组【英文标题】:Laravel Grouping by Eloquent Relationship 【发布时间】:2016-07-27 21:31:19 【问题描述】:

如何按关系分组?

例子

Sales::with('product_detail.product')->groupBy('product_name')->get()

如何用 eloquent 的代码得到结果?

【问题讨论】:

这个问题解决了吗? 【参考方案1】:

您可以指定一个回调函数来对您的关系进行分组,如下所示:

Sales::with(['product_detail.product' => function($query)
        $query->groupBy('product_name');
    ])->get();

【讨论】:

由于关系是通过单独的查询而不是连接来提取的,因此这不能满足 OP 的要求。【参考方案2】:

我认为最佳答案不是回答问题。据我了解,目的是对外部查询的结果进行分组,而不是对关系进行分组。

这在 Eloquent-y 数据库调用中是不可能的,因为对 With 的调用是分开的。您可以手动加入表格并按所需列分组。

如果你想保持 Eloquent-y,Collections 有很多方便的方法,包括 GroupBy。所以你可以先获取数据,然后再分组。

【讨论】:

嘿 Sahil,您能否提供一行代码或示例对所提问题有用?【参考方案3】:

laravel >= 7 你可以使用:

控制器

$user->sales()->groupBy('product_name')->get();

User.php 文件中:

public function sales()
     return $this->hasMany('App\Sales','user_id');

【讨论】:

【参考方案4】:

这可能已经很老了,但它可以帮助寻求者。

您可以在 Laravel 中使用 groupBy 直接链接到关系/远程关系。我不知道这是否特定于任何版本,但 V8 有效。并且关系也像您使用 with 一样被加载。

 Sales::query()->where('this', $that)->get()->groupBy('product.name'); // OR

 Sales::query()->where('this', $that)->get()->groupBy('product.status.name');

【讨论】:

你是对的,它确实帮助了一个寻求者:) 值得注意的是,这是一种与问题中的方法完全不同的groupBy 方法。它正在处理一个集合,而不是数据库查询。【参考方案5】:

按远亲分组:

Sales::select(DB::raw('count(*) as count'), 'products.name')
  ->join('product_details', 'sales.product_detail_id', '=', 'product_details.id')
  ->join('products', 'product_details.product_id', '=', 'products.id')
  ->groupBy('products.name')
  ->get();

【讨论】:

【参考方案6】:

这将帮助您按关系进行分组。

$sales = Order::Sales('product')
        ->where('approved','=','Yes')
        ->groupBy('product_id')
        ->orderBy(DB::raw('COUNT(id)','desc'))
        ->get(array(DB::raw('COUNT(id) as totalsales'),'product_id'));

【讨论】:

以上是关于Laravel 按 Eloquent 关系分组的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent,按月/年分组

Laravel Eloquent 按关系计数排序

Laravel Eloquent 按关系表列排序

Laravel Eloquent按关系表列排序

Laravel Eloquent 模型按局部列和关系模型列值排序

如何通过 Eloquent 中具有多对多关系的外部表中的列聚合进行分组?