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 关系分组的主要内容,如果未能解决你的问题,请参考以下文章