2016-12-21 16 views
5

Laravel 5.3.26 içinde, withCount sonucunu bu ilişkinin bir sütununa göre gruplandırmak mümkün mü? Aşağıdaki gibi bir şey, örneğin: bu belirli kod parçası boş bir koleksiyona geri dönmektedir.groupBy withCount kapatma (Laravel 5.3.26)

Belki de belgelerdeki doğru yerlere bakmıyorum veya düzgün bir şekilde arama yapmıyorum, ancak bu senaryo hakkında hiçbir şey bulamıyorum.

Birisi beni doğru yöne yönlendirebilir mi?

Teşekkürler bir demet!


Düzenleme: Şu anda görünen bu onu çözmüş:

$brands = \App\Models\Brand::with([ 'products' => function ($query) { 
    $query->select('brand_id', 'extra_attribute') 
     ->selectRaw('COUNT(*) AS products_count') 
     ->groupBy('extra_attribute'); 
} ]); 

ve $brand->products->sum('products_count') gibi bir şey aracılığıyla toplam getirmesi mümkün.

Çok kirli hissediyor ve muhtemelen öyle. Bu gerçekten tek yol mu?

cevap

0

groupBy()withCount()withCount() olarak iade koleksiyonunda Brand göre gruplandırılmış her Brand için products toplanmasında istekli yüke öğe sayısı gidiyor içinde kullanılmamalıdır. Bu, Brand numaralı telefondan $brand->products->count()'a eşdeğer olacaktır.

2 örneğiniz arasında, bu verileri başka bir yerde kullanmıyorsanız, groupBy() gerekli değildir.

//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 

--VEYA--

Her iki dünyanın en iyi ve takmak sayısı ve gruplandırılmış olabilir: Eğer varsa, o kadar koleksiyonlarında, toplamlarını erişmek için daha iyi olabilir sadece ikisi yaparak ilişkisi:

$brands = \App\Models\Brand::withCount('products') 
    ->with(['products' => function ($query) { 
     return $query->groupBy('extra_attribute'); 
    }])->get(); 

Sonra erişebilir markanın products_count ve gruplandırılmış ürünler:

$brands->each(function($brand) { 
    $brand->products_count; 
    $brand->products->each(function($products, $extra_attribute) { 
     // Grouped Products 
    }); 
});