用于获取多个表数据的 Hasmany 关系

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于用于获取多个表数据的 Hasmany 关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 8 中获取与 json 有一个 hasMany 关系的表的所有模型?

如何在 Laravel 的 hasMany 关系中使用 groupBy

Ember js - 更新其他表后 Hasmany 关系中断

Laravel hasMany 与 where 在多态关系中

Laravel 关系查询加载 hasMany + BelongsToMany

Laravel hasMany 关系表中的行跨度和 <tr>