在Laravel 5.3.26中,是否可以根据该关系的列对withCount
的结果进行分组?如下所示:
$brands = \App\Models\Brand::withCount([ 'products' => function ($query) {
$query->groupBy('extra_attribute');
} ])
->get();
这段特殊代码返回一个空集合。
也许我只是没有在文档中查找正确的位置或没有正确搜索,但我找不到任何有关此特定情况的内容。
有人能指出我正确的方向吗?
非常感谢!
编辑:目前我似乎用这个解决了它:
$brands = \App\Models\Brand::with([ 'products' => function ($query) {
$query->select('brand_id', 'extra_attribute')
->selectRaw('COUNT(*) AS products_count')
->groupBy('extra_attribute');
} ]);
能够通过类似$brand->products->sum('products_count')
的内容获取总数。
感觉非常脏,可能是。这真的是唯一的方法吗?
答案 0 :(得分:0)
groupBy()
不应使用withCount()
因为withCount()
会为每个{{1}急切加载products
集合中所有项目的计数在返回的集合中按Brand
分组。这相当于Brand
上的$brand->products->count()
。
在您的两个示例之间,如果您没有在其他地方使用此数据,则Brand
是不必要的。如果您是,那么最好以集合形式访问集合中的总计:
groupBy()
<强> - 或 - 强>
您可以充分利用这两个世界,并通过同时执行以下操作来附加计数和分组关系:
//Controller
$brands = \App\Models\Brand::with('products')->get();
//View
@foreach($brands as $brand)
<div>TOTAL PRODUCTS: {{ $brand->products->count() }}</div>
@foreach($brand->products->groupBy('extra_attribute') as $attribute => $products)
<div>TOTAL {{ $attribute }}: {{ $products->count() }}</div>
@endforeach
@endforeach
然后,您可以访问品牌的$brands = \App\Models\Brand::withCount('products')
->with(['products' => function ($query) {
return $query->groupBy('extra_attribute');
}])->get();
和分组产品:
products_count
答案 1 :(得分:0)
当然,您也可以像在with()中一样为withCount()传递闭包,例如,如下所示,它得出user_id 1
对product_id 1
的访问计数
User::where('id', 1)
->withCount(['visits'=> function($q) use ($product_id){
$q->where('product_id', $product_id);
}])