gpt4 book ai didi

php - withCount 闭包中的 groupBy (Laravel 5.3.26)

转载 作者:可可西里 更新时间:2023-11-01 06:52:04 25 4
gpt4 key购买 nike

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

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

最佳答案

groupBy() 不应在 withCount() 中使用,因为 withCount() 会预先加载所有的计数每个 Brandproducts 集合中的项目按返回集合中的 Brand 分组。这相当于单个 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
});
});

关于php - withCount 闭包中的 groupBy (Laravel 5.3.26),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41269493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com