2016-12-21 3 views
5

Laravel 5.3.26では、その関係の列に基づいてwithCountの結果をグループ化できますか?次のようなものがあります。groupBuCount withCount closure(Laravel 5.3.26)

$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

groupBy()withCount()としてwithCount()に使用すべきではないが熱心な負荷に返されるコレクションにBrandでグループ化された各Brandについてproductsのコレクション内のすべての項目のカウントを行っています。これは、単一のBrand$brand->products->count()に相当します。

2つの例の間で、このデータを他の場所で使用していない場合は、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とグループ化された製品にアクセスすることができます:

$brands->each(function($brand) { 
    $brand->products_count; 
    $brand->products->each(function($products, $extra_attribute) { 
     // Grouped Products 
    }); 
}); 
だけの両方を実行して、関係