2016-12-21 18 views
5

Trong Laravel 5.3.26, có thể nhóm kết quả của withCount dựa trên một cột của mối quan hệ đó không? Ví dụ như sau, ví dụ:groupBởi trong withCount closure (Laravel 5.3.26)

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

Đoạn mã cụ thể này trả về bộ sưu tập trống.

Có lẽ tôi chỉ không tìm đúng nơi trong tài liệu hoặc không googling đúng cách, nhưng tôi không thể tìm thấy bất cứ điều gì về kịch bản cụ thể này.

Ai đó có thể chỉ cho tôi đi đúng hướng?

Cảm ơn một nhóm!


Edit: Hiện nay tôi dường như đã giải quyết nó với điều này:

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

và có thể lấy tổng số thông qua một cái gì đó giống như $brand->products->sum('products_count').

Cảm thấy cực kỳ bẩn thỉu và có thể là vậy. Đây có phải là cách duy nhất không?

Trả lời

0

Các groupBy() không nên được sử dụng trong withCount() như withCount() sẽ tải háo hức tính của tất cả các mục trong bộ sưu tập của products cho mỗi Brand nhóm lại theo Brand trong bộ sưu tập trở lại. Điều này tương đương với $brand->products->count() trên một đơn Brand.

Giữa 2 ví dụ của bạn, groupBy() là không cần thiết nếu bạn không sử dụng dữ liệu này ở nơi khác. Nếu bạn đang có, nó có thể là tốt hơn để truy cập vào tổng số của bạn trong các bộ sưu tập như:

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

--OR--

Bạn có thể có tốt nhất của cả hai thế giới và đính kèm các số và các nhóm mối quan hệ bằng cách chỉ làm cả hai:

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

Sau đó, bạn có thể truy cập của thương hiệu products_count và nhóm sản phẩm:

$brands->each(function($brand) { 
    $brand->products_count; 
    $brand->products->each(function($products, $extra_attribute) { 
     // Grouped Products 
    }); 
}); 
Các vấn đề liên quan