当前位置: 首页 > 知识库问答 >
问题:

使用laravel查询生成器根据相关表排序结果

吕自明
2023-03-14

我有两个模型/表:User和POST。一个用户可以有多个帖子,每个帖子属于一个用户。

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();

共有1个答案

丁翰海
2023-03-14

下面是一个原始的MySQL查询,它可以实现以下功能:

SELECT
    t1.id, t1.name
FROM users t1
LEFT JOIN
(
    SELECT user_id, MAX(created_at) AS created_at
    FROM posts
    GROUP BY user_id
) t2
    ON t1.id = t2.user_id
ORDER BY
    t2.created_at;

下面是我对相应的Laravel查询的尝试:

DB::table('users')
    ->select('id', 'name')
    ->join(DB::raw('(SELECT user_id, MAX(created_at) AS created_at
                    FROM posts GROUP BY user_id) t'),
    function($join)
    {
       $join->on('users.id', '=', 't.user_id');
    })
    ->orderBy('t.created_at', 'ASC')
    ->get();
 类似资料:
  • 我试图根据特定属性的特定值对AEM query builder搜索结果进行排序。就像在MySQL这样的数据库中一样,我们也可以根据列的值进行排序(例如,按字段排序('columnName','anyColumnName'))。我们可以在AEM中使用类似的东西吗。 假设我们在path/content/dam/Assets下有5个资产。 资产名称------------dc: title 1.jpg-

  • 假设我们正在使用Laravel的查询生成器: 我正在寻找一个等效的SQL: 当我必须键入大量select和WHERE(或者通常在select的列alias中包含别名,并且它在结果数组中使用)时,这将特别有用。如果没有任何表别名,我需要输入更多的内容,所有内容的可读性都会降低。在laravel文档中找不到答案,有什么想法吗?

  • 我正在尝试输出一个显示求职者对特定工作的申请的视图。到目前为止,我只能查看所有接收到的应用程序的转储,但我无法实现查询来仅查看特定作业的应用程序。即我希望能够查看每个不同空缺职务的条目。谢谢 \\ \\

  • 我有一个问题,使laravel查询: 我想举个例子: 我有这个但不起作用:

  • 我想在查询生成器laravel中orderBy 因为我的是类型 所以当它排序的时候...结果远远不是我想要的... 我的剧本就像这样 我已经试过了 我如何铸造OrderBy查询生成器,以便我可以排序desc

  • 我正在使用Laravels查询生成器检索带有一些筛选选项的项目列表-我需要在此查询中进行计数: 计算“Freestyle ID”在likes表中出现的次数。 这有可能吗?返回的数据是完美的,我只需要一个自由泳的喜欢量,其中喜欢表中的自由泳ID为空。