2021-02-01 18:06:00
围观(5130)
最近遇到了一个比较少见的需求,一个商城的订单操作日志,日志都是存在 MySQL ,但是使用的是不同的数据表,例如 A 表存放该订单的常规操作日志(例如 下单成功、发货成功、收货成功、完成交易), B 表存放该订单的退款日志。
需求是在后台管理查看订单详情的时候需要将这些日志同时显示出来,并且要按照时间做倒叙。
博主想到了两种方法,一种是使用 SQL 查询直接处理。 例如这样:
SELECT * FROM a UNION ALL SELECT * FROM b ORDER BY created_at DESC
另外一种则是使用语言层面进行处理,例如先是从 A 和 B 两个表分别查询数据,再合并到同一个数组,再进行处理:
$result = arrayDateSort([ [ 'id' => 0, 'content' => '这是内容', 'created_at' => '2021-02-10 14:55:00', ], [ 'id' => 1, 'content' => '这是内容1', 'created_at' => '2021-02-01 14:40:00', ], [ 'id' => 2, 'content' => '这是内容2', 'created_at' => '2021-02-01 14:50:00', ] ]); var_dump($result); function arrayDateSort(array $data, $sort = SORT_DESC, string $field = 'created_at') { foreach ($data as &$row) { // 将时间字段转为时间戳 $temp = strtotime($row[$field]); if ($temp) { $row[$field] = $temp; } } $lstTime = array_column($data, $field); array_multisort($lstTime, $sort, $data); return $data; }
最后打印出来的结果:
array(3) { [0]=> array(3) { ["id"]=> int(0) ["content"]=> string(12) "这是内容" ["created_at"]=> int(1612940100) } [1]=> array(3) { ["id"]=> int(2) ["content"]=> string(13) "这是内容2" ["created_at"]=> int(1612162200) } [2]=> array(3) { ["id"]=> int(1) ["content"]=> string(13) "这是内容1" ["created_at"]=> int(1612161600) } }
从博主定义的 arrayDateSort 方法可以看到,是可以自定义正序还是倒叙以及时间字段的,所以相对来说还比较容易扩展。
这两种方法还是有点区别的,第一种直接交给数据库处理,优点是不需要另外自己处理,直接查询出来已经处理过的数据,缺点是两个被查询的表字段列和类型必须相同,如果两个表差异比较大,这种方法就很难受了。
第二种方法就比较容易扩展和友好,只要你的数组里面带有 'created_at' 就可以了。
本文地址 : bubaijun.com/page.php?id=229
版权声明 : 未经允许禁止转载!
上一篇文章: PHP将大量数据导出为Excel的解决方式及性能测试
下一篇文章: Laravel 使用 MongoDB 数据库