在开发过程中,我们经常遇到一对多的场景,

例如:查询订单列表,并且展示订单详情商品、数量数据

思路0:传统做法

a. 查询订单列表

b. 遍历订单详情
$orderList = select from order where xx;
foreach($orderList as $orderItem) {
$orderItem->detailList = select
from order_detail where order_id = $orderItem->id;
}
分析:查询SQL次数为:N+1(N为订单个数),这样频繁请求数据库,影响效率

优化:减少频繁请求数据库

思路1:

a. 查询订单列表后,利用in查出所有订单详情

b. 通过(订单表id => 订单详情表order_id)遍历匹配数据
$orderList = select from order where xx;
$orderId = array_pluck($orderList, ‘id’); // Laravel内置数组辅助函数
$orderDetailList = select
from order_detail where order_id IN $orderId;
foreach($orderList as $orderItem) {
$detailListTemp = [];
foreach($orderDetailList as $orderDetailItem) {
if ($orderItem->id == $orderDetailItem->order_id) {
$detailListTemp[] = $orderDetailItem;
}
}
$orderItem->detailList = $detailListTemp;分析:降低查询后,但2层遍历,复杂度较高,数量过大容易内存溢出

优化:降低复杂度

思路2:

a. 查询订单列表后,利用in查出所有订单详情

b. 订单详情列表转换成以订单ID为索引,用isset来匹配订单的详情
$orderList = select from order where xx;
$orderId = array_pluck($orderList, ‘id’); // Laravel内置数组辅助函数
$orderDetailList = select
from order_detail where order_id IN $orderId;

  1. // 将订单详情转换成以订单ID为索引【方式1】
  2. $orderDetailList = arrayGroup($orderDetailList, 'order_id');
  3. // 或:将订单详情转换成以订单ID为索引【方式2:如果为一对一,可以用array_column】
  4. // $orderList = array_column($orderDetailList, null, 'order_id');
  5. foreach($orderList as $orderItem) {
  6. $orderItem->detailList = $orderDetailList[$orderItem->id] ?? [];
  7. }
  8. // 根据KEY数组分组
  9. function arrayGroup($list, $key) {
  10. $newList = [];
  11. foreach ($list as $item) {
  12. $newList[$item[$key]][] = $item;
  13. }
  14. return $newList;

更多相关文章

  1. SQLServer 获得用户最新或前n条订单的几种SQL语句小结
  2. 利用sql函数生成不重复的订单号的代码
  3. 存储过程实现订单号,流水单号(8位)的详细思路
  4. SQL server高并发生成唯一订单号的方法实现
  5. sql server把退款总金额拆分到尽量少的多个订单中详解
  6. SQL Server表分区删除详情
  7. SQL Server 触发器详情
  8. MySQL下载安装详情图文教程
  9. mysql滑动订单问题原理与解决方法实例分析

随机推荐

  1. Delphi XE5 for android 调用Java类库必
  2. Android如何实现ListView的Item松开渐变
  3. android java.lang.SecurityException: P
  4. Android客户端与J2EE服务器的互联
  5. Android关于常用正则号码类Util
  6. 我们把 iOS 的 Cocoa Touch 移植到了 And
  7. 基于Android的SIP电话-----Speex 回音消
  8. Android接入微信支付完全解析,太全了~
  9. Android 计算器源码
  10. Android的理解