我以前曾试图在这个问题上寻求帮助,但我认为人们要么误解我的问题,要么不太了解我想要实现的目标,使用Eloquent / Laravel。
每个用户都有很多类别。每个类别都有很多文章。 我想从用户拥有的一组类别中检索所有文章。
所以说用户有类别1,类别2,我想要检索类别1和类别2中的所有文章。
对于下面这些belongsToMany关系中的每一个,我都有自己的数据透视表。
article_categories
id | articleID |的categoryId
users_cats
id | user_details_id | categories_id
关系。
Articles.php
public function categories()
{
return $this->belongsToMany('App\Categories', 'article_categories', 'articleID', 'categoryID');
}
UserDetails.php
public function Categories()
{
return $this->belongsToMany('App\Categories', 'users_cats', 'user_details_id', 'categories_id');
}
Categories.php
public function articles()
{
return $this->belongsToMany('App\Article', 'article_categories', 'categoryID', 'articleID');
}
public function UserDetails()
{
return $this->HasMany('App\UserDetails', 'users_cats', 'user_details_id', 'categories_id');
}
我已经尝试过使用HasMany,但据我所知,它并不适用于多对多的关系。
目前(作为一种“解决方法”)我一直在使用它。我已经提取了一个用户类别的列表,并搜索了所有ID,并在UserDetails.php中提取相关文章并从中形成一个集合
$user = self::find($this->id);
$user = $user->Categories;
foreach ($user as $item) {
foreach ($item->articles as $article)
$article1[] = Article::find($article->id);
}
$articles = collect($article1)->sortByDesc('date')->unique();
return $articles;
但是我不认为它会随着数据的增加而很好地扩展(它已经产生超过1k的查询,只有1000篇文章,加载时间超过8秒)。
有什么想法吗?
答案 0 :(得分:0)
尝试创建一个函数,用:
public function User_all_artical($id){
$aricles=DB::table('articles') //open articles table
->join('categories',function($join) use ($id)){ //join to categories table
$join->on('articles.categoryID','=','categories.id')//where from articles table the categoryID column === categories table ID column
->where('categories.userID',$id); //where categories have user id ==$id
}
->get();
}
答案 1 :(得分:0)
您可以使用Nested eager loading
$user=User::with('categories.articles')->find(1);
foreach($user->categories as $category)
{
echo $category->name;
forech($category->articles as $article)
{
echo $article->name;
}
}
答案 2 :(得分:0)
您可以将以下内容添加到UserDetails
模型中:
public function articles()
{
return $this->Categories()->getRelated()->articles()->getRelated()
->whereHas('Categories', function ($query) {
$query->whereHas('UserDetails', function ($query) {
$query->where('id', $this->id);
});
});
}
这样你就可以做到:
$user->articles()->orderBy('date', 'desc')->get();
希望这有帮助!