我使用的是laravel 5.3,需要一些关于Eloquent模型查询的帮助。我有三个模型(UserDetails,Categories,Articles)。我在UserDetails->Categories(belongstoMany)之间有一种关系,在Categories->Articles(belongstoMany)间有一种很好的关系。但是,我该如何获取Userdetails->Categories->Articles之间的关系数据呢。
每个单独的关系都运行良好,即Userdetails::find(1)->categories和categories::find(1)->Articles。
我有一种感觉,示波器可能是答案,但当我尝试时,它们似乎不起作用。
模型中的关系
UserDetails.php
public function Categories(){
return $this->belongstoMany('AppCategories', 'users_cats', 'user_id','cat_id');
}
Categories.php
public function articles(){
return $this->belongsToMany('AppArticle', 'article_categories', 'categoryID', 'articleID');
}
我已经研究过HasManyThrough函数,但再一次,我在实现它时遇到了问题,据我所见,它应该是
return $this->hasManyThrough('AppArticle', 'AppCategories', TertiaryForeignKey, FinalForeignKey, LocalForeignKey);
我的桌子被设置为
articles_categories数据透视表
articleID–文章的主键
categoryID–类别的主键
users_cats数据透视表
user_id–userdetails 的主键
cat_id–类别的主键
基于此,hasManyThrough应该是这样的吗?
public function articles(){
return $this->hasManyThrough('AppArticle', 'AppCategories', 'user_id', 'articleID', 'id');
}
但是,这会返回错误未找到列:1054"字段列表"中的未知列"categories.user_id">
更新
所以如果你想有这种关系
用户详细信息->类别->文章
那么你需要做这个:
用户详细型号:
public function categories()
{
return $this->hasMany(Category::class);
}
public function articles()
{
return $this->hasManyThrough(Article::class, Categories::class);
}
类别型号:
public function userdetails()
{
return $this->belongsTo(Userdetails::class);
}
public function categories()
{
return $this->hasMany(Category::class);
}
文章型号:
public function categories()
{
return $this->belongsToMany(Category::class);
}
然后您可以直接调用UserDetails::find(1)->articles->get();
您只需要在UserDetails.php型号:
public function categories()
{
return $this->hasMany(Categories::class);
}
在Categories.php模型中:
public function articles()
{
return $this->hasMany(Articles::class);
}
然后,您可以在控制器中检索类别集合:
$userdetails = UserDetails::get();
将$categories变量传递到View中,并使用foreach循环显示每条记录(其中文章是模型中的函数)
@foreach($userdetails->categories as $usercategories )
<div> {{$usercategories->name}} </div>
@foreach($usercategories->articles as $categoryarticles )
<div> {{$categoryarticles->name}} </div>
@endforeach
@endforeach
使用第二个foreach,您将访问属于用户的类别的文章。