【问题标题】:laravel multi-level many to manylaravel 多级多对多
【发布时间】:2020-11-10 04:36:47
【问题描述】:

我有 3 个模型,行业、类别、机器,它们的链接如下

  • 行业可以有多个分类,一个分类只能在 一个行业(存储在类别表中的行业 ID)
  • 一个类别可以有多台机器,一台机器可以属于多个类别(使用数据透视表)

问题:我想展示一个行业中的所有机器,我该怎么做?

到目前为止我所做的:我检索了与特定行业相关的所有类别 ID,例如:$industry->categories()->pluck("id")。我不知道接下来我能做什么来获得所有机器

【问题讨论】:

    标签: laravel eloquent-relationship


    【解决方案1】:

    Industry模型关系:

    class Industry {
        public function categories(){
            return $this->hasMany(Category::class);
        }
    }
    

    Category模型关系:

    class Category {
        public function indusry(){
            return $this->hasOne(Industry::class);
        }
    
        public function machines(){
            return $this->belongsToMany(Machine::class);
        }
    }
    

    Machine模型关系:

    class Machine {
        public function categories(){
            return $this->belongsToMany(Category::class);
        }
    }
    

    您可以像这样使用whereHas 方法:

    $machines = Machine::whereHas('categories', function($query) {
        $query->whereHas('indusry', function($sub_query) {
            $sub_query->where('name', {your_industry});
        });
    });
    

    【讨论】:

    • 我必须将“category_id”存储在机器表中才能使其正常工作。我不能,因为我在类别和机器之间有多对多的关系。这是通过数据透视表实现的
    • 你不需要存储category_id,当你使用from hasManyThrough关系时,这可以提供machinesindustries之间的关系,并且你可以访问所有机器在一个行业喜欢:$industry->machines()
    • 我收到此错误:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'machines.category_id' in 'on Clause' (SQL: select count(*) as aggregate from machines内部连接categoriescategories.id = machines.category_id 其中categories.industry_id = 1)
    • 哦,对不起,这是我的错误,我会更新答案。
    • 谢谢,我能够使用您的答案获得结果,但稍作改动如下 $industry = Industry::where("slug","=",$industry_slug)->first (); $categories = $industry->categories()->pluck('id'); $machines = Machine::whereHas('categories', function($q) use ($categories) { return $q->whereIn('id', $categories); })->paginate(20);
    【解决方案2】:

    $categories = $industry->categories()->pluck("id"); $machines = App\Machine::query()->whereIn('category_id', $categories)->get();

    【讨论】:

    • 我必须将“category_id”存储在机器表中才能使其正常工作。我不能,因为我在类别和机器之间有多对多的关系。这是通过数据透视表实现的
    • 如果使用多态操作morphToMany,morphedByMany,可以高效处理。您可以按照示例-itsolutionstuff.com/post/…
    猜你喜欢
    • 2016-03-16
    • 2018-06-28
    • 2021-09-04
    • 2013-08-21
    • 2016-09-03
    • 1970-01-01
    • 2022-06-26
    • 2018-03-03
    • 1970-01-01
    相关资源
    最近更新 更多