【问题标题】:Hasmany relationship for fetching multiple table data用于获取多个表数据的 Hasmany 关系
【发布时间】:2020-11-08 20:38:26
【问题描述】:

我有三个表来存储类别。一个是主要类别,另一个是次要类别,第三个是最终类别。现在我想用主要类别获得最终类别。

我可以通过关系通过PrimaryCategory Model获得具有Primary的Secondary categories:

public function secondaryCategories(){
    return $this->hasMany('App\Models\SecondaryCategory');
}

但是现在在获取二级类别时,我想在二级类别的关系对象中获取最终类别。

我的意思是次要类别应该在主要类别的关系对象中,而最终类别应该在次要类别的关系中。我们该怎么做?

【问题讨论】:

    标签: php laravel eloquent laravel-relations


    【解决方案1】:

    您可以通过对您定义的方法进行小的更改来实现这一点。

    替换这个:

    public function secondaryCategories(){
        return $this->hasMany('App\Models\SecondaryCategory');
    }
    

    收件人:

    public function secondaryCategories(){
        return $this->hasMany('App\Models\SecondaryCategory')->with('finalCategory');
    }
    

    并将以下方法添加到您的 Secondary Category 模型

    public function finalCategory(){
        return $this->hasMany('App\Models\FinalCategory');
    }
    

    这将获取次要类别中的最终类别。

    【讨论】:

    • 这不是最好的方法,因为它总是会加载最终类别。在某些情况下,他不需要加载最终类别,但您提供的方法将始终加载最终类别,无论他是否愿意。
    • @AkhtarMunir 我试过你的方法。它返回与我的方法相同的结果。我不明白他不需要加载最终类别的地方。我想知道,因为我想我可以从你那里学到新东西。
    • 是的,当然它会返回相同的结果。假设他想显示主要和次要类别,并且如果他想逐个显示类别,则不需要最终类别和下拉列表。
    【解决方案2】:

    主要类别模型

    public function secondaryCategories(){
       return $this->hasMany('App\Models\SecondaryCategory');
    }
    

    次要类别模型

    public function finalCategories(){
       return $this->hasMany('App\Models\FinalCategory');
    }
    

    现在,当您从主要类别获取记录时,它会变成这样

    $categories = PrimaryCategory::with('secondaryCategories.finalCategories')->get();
    

    请注意,. 将创建一个嵌套级别,例如在第一级您将拥有主要类别,在第二级您将拥有次要类别,在第三级您将拥有最终类别。

    您还可以通过具有 hasManyThrough 关系的二级类别仅加载最终类别

    主要类别模型内部

    public function finalCategories()
    {
        return $this->hasManyThrough('App\Models\FinalCategory', 'App\Models\SecondaryCategory');
    }
    

    然后这样做

    $categories = PrimaryCategory::with('finalCategories')->get();
    

    查看文档以了解在使用不同主键或外键时遇到的任何问题 https://laravel.com/docs/7.x/eloquent-relationships#has-many-through

    【讨论】:

      猜你喜欢
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 2023-03-31
      • 2014-10-29
      • 2018-09-29
      相关资源
      最近更新 更多