You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:04:31