Laravel 8中如何实现用户记录按created_at与updated_at混合升序排列?
实现方法
要在Laravel 8里实现把users表每条记录输出两次(分别携带created_at和updated_at),并按日期混合升序排列,可以通过unionAll合并两个查询结果的方式来实现,具体代码如下:
方法一:使用查询构造器
// 构造第一个查询:取所有用户,用created_at作为排序日期,标记来源为创建时间 $createdQuery = DB::table('users') ->select( 'id', 'name', 'created_at as sort_date', DB::raw('"created" as date_source'), // 可选字段,用来区分记录是创建/更新时间 // 按需添加其他需要的字段,比如email、phone等 ); // 构造第二个查询:取所有用户,用updated_at作为排序日期,标记来源为更新时间 $updatedQuery = DB::table('users') ->select( 'id', 'name', 'updated_at as sort_date', DB::raw('"updated" as date_source'), // 对应添加其他字段 ); // 合并两个查询,按统一的sort_date字段升序排序 $finalResults = $createdQuery->unionAll($updatedQuery) ->orderBy('sort_date', 'asc') ->get();
方法二:使用Eloquent模型(已创建User模型时)
// 基于User模型构造查询 $createdQuery = User::select( 'id', 'name', 'created_at as sort_date', DB::raw('"created" as date_source') ); $updatedQuery = User::select( 'id', 'name', 'updated_at as sort_date', DB::raw('"updated" as date_source') ); // 合并查询并排序 $finalResults = $createdQuery->unionAll($updatedQuery) ->orderBy('sort_date') ->get();
关键说明
- unionAll的作用:和union不同,unionAll不会对结果去重,能保证每条用户记录被输出两次(一次对应created_at,一次对应updated_at)。
- sort_date字段:将created_at和updated_at统一重命名为sort_date,合并后直接按该字段排序,就能实现两类日期的混合升序排列。
- date_source字段:可选添加,用来区分当前记录的日期是创建时间还是更新时间,不需要的话可以直接删除该字段的查询。
- 全字段获取:如果需要获取用户表的所有字段,可把select里的具体字段替换为
DB::raw('*'),例如->select(DB::raw('*'), 'created_at as sort_date')。
最终得到的$finalResults就是符合需求的结果集,会按日期从小到大混合展示所有的创建、更新记录。
内容的提问来源于stack exchange,提问作者ErikTailor
相关产品推荐
相关产品推荐

