我怎样才能得到评论作者的名字?

How can I get the name of comments' author?

这是我的 table 结构:

-- users
+----+-------+
| id | name  |
+----+-------+
| 1  | John  |
| 2  | Jack  |
| 3  | Peter |
+----+-------+

-- posts
+----+---------+----------------------+-----------+
| id |  title  |         body         | author_id |
+----+---------+----------------------+-----------|
| 1  | title1  | somthing             | 2         |
| 2  | title2  | whatever             | 1         |
| 3  | title3  | anything             | 3         |
+----+---------+----------------------+-----------+

-- comments
+----+-----------------+---------+-----------+
| id |     message     | post_id | author_id |
+----+-----------------+---------+-----------+
| 1  | my message      | 3       | 2         | 
| 2  | whatever        | 1       | 3         |
+----+-----------------+---------+-----------+

现在我想要 a post 及其所有评论。这是我的代码:

    $post= Posts::orderBy('id', 'DESC')->where('id', $request->id)->first();
    $comments = $post->comments;

注意到我在 User 模型中有这个关系:

public function comments()
{
    return $this->hasMany('App\Comments','post_id', 'id')->orderBy('id');
}

我的问题是什么?我也想知道评论的作者姓名。我的意思是写评论的人的名字。无论如何,我怎样才能在现有关系上建立关系?

注意: 我可以通过原始 JOIN 做到这一点。但是我想知道如何通过 Laravel 关系来做到这一点?

你可以像这样连接两个表

DB::table('comments')
    ->join('users', function ($join) {
    $join->on('comments.author_id', '=', 'users.id');
    })
    ->get();

https://laravel.com/docs/5.4/queries#joins

为什么要定义与task_id的关系?

在用户模型中:

public function comments()
{
    return $this->hasMany('App\Comments','author_id', 'id');
}

在评论模型中:

/**
 * comments belongs to a user.
 */
public function user()
{
    return $this->belongsTo('App\User', 'author_id', 'id');
}

现在您可以获得评论的用户

User::where("id",$userId)->with("comments")->orderBy('id', 'DESC')->get();

如果你想得到 post 和所有评论,你应该为 post 模型定义这样的关系。

posts模型中定义一个关系:

public function comments()
{
    return $this->hasMany('App\Comments','post_id', 'id');
}

在评论模型中:

/**
 * comments belongs to a post.
 */
public function post()
{
    return $this->belongsTo('App\Posts', 'post_id', 'id');
}

现在:

Posts::where("id",$postId)->with("comments")->orderBy('id', 'DESC')->get();