如何在 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