用于获取多个表数据的 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 在多态关系中