laravel withCount 线性嵌套关系

问题描述

我有桌子,

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

ec_brands:id

mp_stores:id

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

品牌模式,

<script> 
var  xaxis = [4,8,16,32,48];
var  yaxis = [1.19,1.48,2.29,3.83,5.4];
            
var config = {
             responsive: true
            }

const arr = [];
for (let i = 0; i < xaxis.length; i++) {
     let obj = {};
     obj['x'] = [xaxis[i]];
     obj['y'] = [yaxis[i]];

    obj['mode'] = 'markers+text';
    //obj['mode'] = 'markers';
    obj['type'] = "scatter";
              
    obj['name'] = `${zaxis[i]}`;
    debugger
    obj['text'] = `${zaxis[i]}`;
    obj['textposition'] = 'right center ';
    obj['textfont'] = {
    family: 'Times New Roman',size: "16",};
    obj['marker'] = {
       size: 12,colorscale: 'red',symbol: 'star-dot'
       }
       arr.push(obj)

}
            

    Plotly.newPlot("iframe",arr,layout,config);
    }

店铺模式

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);
}

现在我介绍了分类一个产品属于多个分类

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

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

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

我想根据请求参数列出一个(品牌、商店、类别)和计数一个产品。

喜欢

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

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

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

structure of UI

建议或解决方案。

谢谢

解决方法

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

所以在你的控制器中:

$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();