Codeigniter:如何从数据库生成嵌套订单数组?
当然可以!这在大多数ORM框架里都是非常常见的需求,核心就是先在模型里定义好表之间的关联关系,然后查询的时候把关联数据一起加载进来,就能轻松得到你想要的嵌套数组结构了。我给你拿两种常用的开发框架举例说明:
Laravel Eloquent 实现方式
第一步:定义模型关联
首先在你的Order模型中,添加一个方法来关联OrderItem模型(一个订单对应多个订单项,属于一对多关系):
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; class Order extends Model { // 假设orders表主键是id,order_items表的外键是order_id public function orderItems(): HasMany { return $this->hasMany(OrderItem::class, 'order_id', 'id'); } }
如果需要反向关联(从订单项找所属订单),可以在OrderItem模型中添加:
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; class OrderItem extends Model { public function order(): BelongsTo { return $this->belongsTo(Order::class, 'order_id', 'id'); } }
第二步:获取嵌套数组
接下来就可以查询并转化为你需要的嵌套数组结构了:
// 预加载所有订单的订单项,避免N+1查询问题 $orders = Order::with('orderItems')->get(); // 转化为嵌套数组 $ordersArray = $orders->toArray();
此时$ordersArray里的每个订单元素,都会包含一个order_items子数组,里面就是该订单对应的所有商品条目。
Django ORM 实现方式
第一步:定义模型关联
先在Django模型中建立外键关联:
from django.db import models class Order(models.Model): # 订单的基础字段,比如订单号、创建时间等 order_number = models.CharField(max_length=20, unique=True) created_at = models.DateTimeField(auto_now_add=True) class OrderItem(models.Model): # 通过related_name指定反向关联的名称,方便后续查询 order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='order_items') product_name = models.CharField(max_length=100) quantity = models.IntegerField() price = models.DecimalField(max_digits=10, decimal_places=2)
第二步:构建嵌套数组
查询时预加载关联数据,再手动组装成嵌套数组:
from django.forms.models import model_to_dict # 预加载订单项,提升查询效率 orders = Order.objects.prefetch_related('order_items').all() # 构建嵌套数组结构 orders_array = [] for order in orders: # 先把订单对象转成字典 order_dict = model_to_dict(order) # 把当前订单的所有订单项也转成数组,嵌套进去 order_dict['order_items'] = [model_to_dict(item) for item in order.order_items.all()] orders_array.append(order_dict)
通用思路总结
不管用什么框架,核心步骤都是这三点:
- 在主模型(Order)中定义一对多的关联关系,指向子模型(OrderItem)
- 查询时使用预加载(比如Laravel的
with、Django的prefetch_related),避免N+1查询的性能问题 - 将查询结果转化为数组/字典,关联的数据会自动(或手动)嵌套在父对象数组中
如果是用原生SQL的话,也可以通过JOIN查询后手动遍历组装嵌套数组,但用ORM会更简洁易维护。
内容的提问来源于stack exchange,提问作者decprog
相关产品推荐
相关产品推荐

