Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于获取多个表数据的多个关系_Php_Laravel_Eloquent_Laravel Relations - Fatal编程技术网

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

Php 用于获取多个表数据的多个关系,php,laravel,eloquent,laravel-relations,Php,Laravel,Eloquent,Laravel Relations,我有三个表来存储分类。一个是初级类别,另一个是次级类别,第三个是最终类别。现在我想得到最终类别和主要类别 我可以通过关系获取与主要类别的次要类别,方法是这样做,即PrimaryCategory模型: public function secondaryCategories(){ return $this->hasMany('App\Models\SecondaryCategory'); } 但是现在在获取二级分类时,我想获取二级分类的关系对象中的最终分类 我的意思是,次要范畴应该在

我有三个表来存储分类。一个是初级类别,另一个是次级类别,第三个是最终类别。现在我想得到最终类别和主要类别

我可以通过关系获取与主要类别的次要类别,方法是这样做,即PrimaryCategory模型:

public function secondaryCategories(){
    return $this->hasMany('App\Models\SecondaryCategory');
}
但是现在在获取二级分类时,我想获取二级分类的关系对象中的最终分类


我的意思是,次要范畴应该在主要范畴的关系客体中,最终范畴应该在次要范畴的关系中。我们如何做到这一点?

主要类别模型

public function secondaryCategories(){
   return $this->hasMany('App\Models\SecondaryCategory');
}
public function finalCategories(){
   return $this->hasMany('App\Models\FinalCategory');
}
public function finalCategories()
{
    return $this->hasManyThrough('App\Models\FinalCategory', 'App\Models\SecondaryCategory');
}
二级分类模型

public function secondaryCategories(){
   return $this->hasMany('App\Models\SecondaryCategory');
}
public function finalCategories(){
   return $this->hasMany('App\Models\FinalCategory');
}
public function finalCategories()
{
    return $this->hasManyThrough('App\Models\FinalCategory', 'App\Models\SecondaryCategory');
}
现在,当您从主要类别中获取记录时,它将变成这样

$categories = PrimaryCategory::with('secondaryCategories.finalCategories')->get();
注意,
将创建一个嵌套级别,就像在第一个级别上,您将拥有主要类别,在第二个级别上,您将拥有次要类别,在第三个级别上,您将拥有最终类别

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

主类别模型内部

public function secondaryCategories(){
   return $this->hasMany('App\Models\SecondaryCategory');
}
public function finalCategories(){
   return $this->hasMany('App\Models\FinalCategory');
}
public function finalCategories()
{
    return $this->hasManyThrough('App\Models\FinalCategory', 'App\Models\SecondaryCategory');
}
然后执行此操作

$categories = PrimaryCategory::with('finalCategories')->get();
有关使用不同主键或外键时遇到的任何问题,请参阅文档

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

替换此项:

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

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');
}

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

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