groupBy with withCount closure(Laravel 5.3.26)

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').

感觉非常脏,可能是.这真的是唯一的方法吗?

Eri*_*ker 3

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)