这是指向我的数据库架构的链接:
如何使用他的ID从用户订阅的博客中获取所有主题?我使用Eloquent ORM。
我已将以下行添加到用户模型中:
public function blogs()
{
return $this->belongsToMany('Blog', 'blog_subscriptions');
}
然后在控制器中请求
User::find(1)->blogs; // User id is hardcoded
有了这个,我得到了用户订阅的所有博客。 现在我被困在如何获取这些博客的主题。
答案 0 :(得分:2)
假设关系:
// User
belongsToMany('Blog', 'user_subscriptions')
// Blog
belongsToMany('User', 'user_subscriptions')
hasMany('Topic')
// Topic
belongsTo('Blog')
1我的方式,无论嵌套有多深,这都适用于任何关系:
User::with(['blogs.topics' => function ($q) use (&$topics) {
$topics = $q->get()->unique();
}])->find($userId);
2雄辩的标准方法:
$topics = Topic::whereHas('blog', function ($q) use ($userId) {
$q->whereHas('users', function ($q) use ($userId) {
$q->where('users.id', $userId);
});
})->get();
// or
$user = User::find($userId);
foreach ($user->blogs as $blog)
{
$blog->topics; // collection of topics for every single blog
}
3加入:
$topics = Topic::join('blogs', 'topics.blog_id', '=', 'blogs.id')
->join('user_subscriptions as us', function ($j) use ($userId) {
$j->on('us.blog_id', '=', 'blogs.id')
->where('us.user_id', '=', $userId);
})->get(['topics.*']);
请注意,最后的解决方案将依赖于您的数据透视数据一致性。也就是说,如果您无法确定user_subscriptions
中没有冗余条目(例如,博客或用户已被删除但枢轴条目仍然存在),那么您需要进一步加入{{1同样。
答案 1 :(得分:0)
我是laravel的新手,我没有可能对此进行测试,但我有类似的需求并用这样的东西解决了:
DB::Query('topics')->join('blogs', 'blogs.id', '=', 'topics.blog_id')
->join('blog_subscriptions', 'blogs.id', '=', 'blog_subscriptions.blog_id')
->select('name.id','table.email')
->where('blog_subscriptions.user_id', '=', $user_id);