【发布时间】:2018-07-29 12:57:54
【问题描述】:
我有两个模型/表:用户和帖子。一个用户可以有很多帖子,每个帖子属于一个用户。
我正在尝试根据用户最近的帖子创建时间长短按升序返回用户列表。
例如
users:
id | name |
--------------------
1 | user 1 |
2 | user 2 |
3 | user 3 |
posts:
id | user_id | created_at |
---------------------------------------------
1 | 1 | 2018-02-19 08:00 |
2 | 2 | 2018-02-19 09:00 |
3 | 3 | 2018-02-19 10:00 |
4 | 1 | 2018-02-19 11:00 |
5 | 1 | 2018-02-19 12:00 |
6 | 2 | 2018-02-19 13:00 |
我希望能够返回以下结果
[
{
id: 3,
name: "user 3"
},
{
id: 1,
name: "user 1"
},
{
id: 2,
name: "user 2"
}
]
由于用户 3 的最新帖子创建时间最长,其次是用户 1,然后是用户 2。
到目前为止,我已经尝试过了,但它为用户返回了重复的结果:
return $this->builder
->join('posts', function ($join) {
$join->on('users.id', '=', 'posts.user_id')
->orderBy('posts.created_at', 'desc')
->limit(1);
})
->orderBy('posts.created_at', 'asc')
->get();
我也试过这个,它没有返回任何重复的结果,但排序错误:
return $this->builder
->join('posts', 'users.id', '=', 'posts.user_id')
->groupBy('users.id')
->take(1)
->orderBy('posts.created_at', 'asc')
->get();
我觉得这是我所追求的两者的某种组合,但我无法解决。任何帮助将不胜感激,非常感谢。我正在使用 Laravel 5.4
【问题讨论】:
-
return $this->builder->join('posts', 'users.id', '=', 'posts.user_id')->orderBy('posts.created_at', 'desc')->groupBy('users.id')->get()的输出是什么? -
嗨 @linktoahref 该查询按 3、2、1 的顺序返回用户
-
如果你这样做
groupBy('posts.user_id')会怎样? -
相同的结果:3、2、1
标签: mysql sql database laravel join