groupBy with withCount closure(Laravel 5.3.26)

时间:2016-12-21 18:24:59

标签: php mysql laravel join eloquent

在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')的内容获取总数。

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

2 个答案:

答案 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 1product_id 1的访问计数

User::where('id', 1)
->withCount(['visits'=> function($q) use ($product_id){
   $q->where('product_id', $product_id);
}])