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

时间:2020-07-19 13:43:24

标签: php laravel eloquent laravel-relations

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

我可以通过PrimaryCategory Model通过关系获得与Primary的Secondary分类:

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

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

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

2 个答案:

答案 0 :(得分:1)

您可以通过对定义的方法进行少量更改来实现此目的。

替换此:

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

收件人:

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

并将以下方法添加到您的二级类别模型

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

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

答案 1 :(得分:0)

主要类别模型

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

中学类别模型

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

现在,当您从主要类别获取记录时,它将变成这种方式

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

请注意,此.会创建一个嵌套级别,例如在第一个级别上您将具有主要类别,在第二个级别上您将具有辅助类别,而在第3个级别上您将具有最终类别。

您还可以通过具有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