如何在 Laravel 中的其他 2 个连接表上按日期列排序表?

Posted

技术标签:

【中文标题】如何在 Laravel 中的其他 2 个连接表上按日期列排序表?【英文标题】:How to order table by date column on 2 other joined tables in Laravel? 【发布时间】:2020-03-27 22:01:58 【问题描述】:

我有以下表格:

table_1
id      | table_2_id |  table_3_id | table_1_specific_columns
1       | null       | 1           |
2       | 1          | null        |
...

和:

table_2
id      | table_2_specific_columns| date
1       | blabla                  | 01-01-1990
2       | bababa                  | 02-02-1992
...

和:

table_3
id      | table_3_specific_columns| date
1       | blabla                  | 01-01-1991
2       | bababa                  | 02-02-1989
...

数据库是PostgreSQL

如何在 Laravel 中对 table_2 和 table_3 连接表按日期列排序 table_1?

这可以使用 Eloquent 完成吗?

编辑:如果可以使用 eloquent 完成,预期的结果是 table_1 模型的集合,其中 table_2 和 table_3 关系按 table_2 和 table_3 中的日期列排序

编辑2:

table_1 的 asc 排序的预期结果。添加日期列是为了快速参考,不是必需的。

id      | table_2_id |  table_3_id           | date
1       | null       | 2                     | 02-02-1989
2       | 1          | null                  | 01-01-1990
1       | null       | 1                     | 01-01-1991
2       | 2          | null                  | 02-02-1992

【问题讨论】:

同时指定预期结果。 @jarlh 添加了预期结果 指定,而不是描述。 @jarlh 添加了订购后结果的具体示例 【参考方案1】:

根据您分享的内容,您要么拥有 table_2 或 table_3 关系(如果有的话),因此您可以这样做:

DB::table('table_1')
    ->leftJoin('table_2', 'table_1.table_2_id','table_2.id')
    ->leftJoin('table_3', 'table_1.table_3_id','table_3.id')
    ->select('table_1.*')
    ->orderByRaw('COALESCE(table_2.date, table_3.date)');

注意:如果一行与表 2 和表 3 相关,则顺序仅由 table_2 给出

这里的缺点是您还将包含与任何内容无关的 table_1 的任何行。您可以通过添加 ->whereNotNull('table_2.id')->orWhereNotNull('table_3.id')

来省略这些

如果您有模型,您可以修改上面的内容以使用例如Table1::leftJoin.... 而不是在这种情况下使用 DB::table select('table_1.*') 变得更加重要,不要在模型对象中添加错误的值

【讨论】:

【参考方案2】:

您好,您可以使用语法

orderByRaw

所以你的代码将类似于:

Table::orderByRaw("column DESC, column2 ASC")->get();

【讨论】:

以上是关于如何在 Laravel 中的其他 2 个连接表上按日期列排序表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有主键的表上按顺序更新表?

Laravel 不能在使用 belongsToMangy 连接的表上使用 where

Laravel 5.8 在数据透视表上保存一对多关系

您如何连接来自其他表或我的第 5 个表上的用户输入的数据?

如何使用Laravel Schema Builder在表上设置注释

如何在两个大型 postgreSQL 表上批量运行外连接?