【问题标题】:laravel withCount of linear nested relations in laravellaravel withCount 在 laravel 中的线性嵌套关系
【发布时间】:2026-02-10 06:10:01
【问题描述】:

我有桌子,

ec_products : id | brand_id(来自 ec_brands 的 ID)| store_id(来自 mp_stores 的 ID)

ec_brands:id

mp_stores:id

我正在计算属于每个品牌和商店的总产品,使用 Laravel 的关系和 withCount, Like,

品牌模型,

public function products()
{
    return $this->hasMany(Product::class, 'brand_id')->where('is_variation', 0);
}

店铺模式

public function products()
{
    return $this->hasMany(Product::class, 'store_id')->where('is_variation', 0);
}

在每个模型中,

$data = $data->withCount(‘products’);

现在我介绍了类别,一个产品属于多个类别。

所以使用单独的表格来链接类别和产品。

ec_product_category_product:id | category_id(来自类别表)| product_id(来自我们的产品表)

所以我有最后一个问题,如何加入所有人,

我想列出这些(品牌、商店、类别)中的每一个,并根据请求参数计数每个产品。

喜欢

如果选择了任何品牌,则计算与该品牌相关的商店和类别。

如果选择了商店,则计算与该商店相关的品牌和类别。

如果选择了任何类别,则计算与该类别相关的商店和品牌。

structure of UI

建议或解决方案。

谢谢

【问题讨论】:

    标签: php mysql laravel relation


    【解决方案1】:

    你应该总是从你想要操作的对象开始你的 Eloquent 查询,这里是 Product,然后约束你的查询,

    所以在你的控制器中:

    $product_count = Product::when($request->category_id, function($query) use ($request){
           $query->where('category_id', $request->category_id);
        })
    [...] //do that for each of your constraints
    ->count();
    

    例如,如果您想搜索类别名称,请使用 whereHas :

    $product_count = Product::when($request->search, function($query) use ($request){
           $query->whereHas('category', function($query) use ($request){
                 $query->where('name', 'like', "%$request->search%");
           });
        })
    [...] //do that for each of your constraints
    ->count();
    

    【讨论】:

    • 我的查询是计算产品属于各自的过滤器,因为我有单独的雄辩查询来获取真实数据。因此,寻找不影响性能的最佳解决方案。我们正在处理的页面,电子商务列表页面,左侧过滤器(计数)和右侧项目列表。表结构 [链接] (pasteboard.co/K5YEge8F.png)
    • 过滤器部分截图附在主帖中。 @MathieuFerre