如何使用Eloquent ORM使用多对多关系的结果查询表?

时间:2014-12-12 09:31:26

标签: laravel eloquent

这是指向我的数据库架构的链接:enter image description here

如何使用他的ID从用户订阅的博客中获取所有主题?我使用Eloquent ORM。

我已将以下行添加到用户模型中:

public function blogs()
{
    return $this->belongsToMany('Blog', 'blog_subscriptions');
}

然后在控制器中请求

User::find(1)->blogs;  // User id is hardcoded

有了这个,我得到了用户订阅的所有博客。 现在我被困在如何获取这些博客的主题。

2 个答案:

答案 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);