Thi*_*rry 6 php mysql join laravel eloquent
在Laravel 5.3.26中,是否可以withCount根据该关系的列对结果进行分组?例如:如下:
$brands = \App\Models\Brand::withCount([ 'products' => function ($query) {
$query->groupBy('extra_attribute');
} ])
->get();
Run Code Online (Sandbox Code Playgroud)
这段特殊代码返回一个空集合.
也许我只是没有在文档中查找正确的位置或没有正确搜索,但我找不到任何有关此特定方案的信息.
有人能指出我正确的方向吗?
谢谢你!
编辑:目前我似乎用这个解决了它:
$brands = \App\Models\Brand::with([ 'products' => function ($query) {
$query->select('brand_id', 'extra_attribute')
->selectRaw('COUNT(*) AS products_count')
->groupBy('extra_attribute');
} ]);
Run Code Online (Sandbox Code Playgroud)
并能够通过类似的东西获取总数$brand->products->sum('products_count').
感觉非常脏,可能是.这真的是唯一的方法吗?
不groupBy()应该用于withCount()为返回的集合中的每个分组withCount()依据急切加载集合中所有项目的计数。这相当于在单个.productsBrandBrand$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
Run Code Online (Sandbox Code Playgroud)
- 或者 -
您可以两全其美,并通过执行以下两项操作来附加计数和分组关系:
$brands = \App\Models\Brand::withCount('products')
->with(['products' => function ($query) {
return $query->groupBy('extra_attribute');
}])->get();
Run Code Online (Sandbox Code Playgroud)
然后您可以访问该品牌products_count和分组的产品:
$brands->each(function($brand) {
$brand->products_count;
$brand->products->each(function($products, $extra_attribute) {
// Grouped Products
});
});
Run Code Online (Sandbox Code Playgroud)