Laravel关系条件 - 3个表

时间:2014-09-15 13:26:31

标签: laravel laravel-4

我的情况是我有帖子,用户和评论。

每个评论都存储一个post_id和一个user_id。我想要做的是获取用户对特定帖子的所有评论,以便我可以这样打电话:

$comments = Auth::User()->comments(post_id=x)->text

(我知道x是什么)

我有:

User->HasMany(comments)
Comments->HasOne(User)
Comments->HasOne(Project)
Project->HasMany(comments)

我觉得需要有一个地方或者一个地方或者一个地方或者某个地方或者其他什么东西......我能管理的最好的是我将Auth :: User() - >注释引入数组然后搜索数组,直到我找到匹配的帖子ID ..这似乎很浪费。

3 个答案:

答案 0 :(得分:1)

with不会应用任何联接,因此您无法引用其他表。

您可以使用:

// User model
public function comments()
{
  return $this->hasMany('Comment');
}

// Comment model
public function scopeForPost($query, $postId)
{
  $query->where('post_id', $postId);
}

// then you can do this:
Auth::user()->comments()->forPost($postId)->get();

或者,您可以使用约束来加载评论:

User::with(['comments' => function ($q) use ($postId) {
   $q->where('post_id', $postId);
}])->find($someUserId);

// or exactly the same as above, but for already fetched user:
// $user .. or
Auth::user()->load(['comments' => function ($q) use ($postId) {
   $q->where('post_id', $postId);
}]);

// then you can access comments for $postId just like this:
Auth::user()->comments; // collection

答案 1 :(得分:0)

当您需要过滤关系时,您只需在您的Eloquent查询中执行此操作:

$data = User::with('posts', 'comments')
          ->where('users.id', Auth::User()->id)
          ->where('posts.id', $postID)
          ->get();

然后你可以

foreach($data->comments as $comment)
{
   echo $comment->text;
}

答案 2 :(得分:0)

您的评论表将包含外键Post_Id和User_ID

要访问特定用户的特定帖子的所有评论,您可以尝试这种方式吗?

Comment::select('comments.*')
                        ->where('comments.user_id', Auth::user()->id)
                        ->leftJoin('posts','posts.id','=','comments.post_id')
                        ->leftJoin('users','users.id','=','comments.user_id')
                        ->get();

我确定有更好的方法来实现它,但这应该会给你想要的结果。

注意如果列名冲突,请使用别名

如果有效,请告诉我。