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

使用Doctrine Query Builder实现按客户分组取orders表最新订单记录

Doctrine查询构造器实现每个客户最新订单查询方案

正确可运行代码

// 初始化主查询构造器
$qb = $entityManager->createQueryBuilder();
$qb->select('t1')
   ->from(\App\Entity\Order::class, 't1');

// 构造子查询:查询每个客户对应的最新订单时间
$subQb = $entityManager->createQueryBuilder();
$subQb->select('MAX(t2.date) as max_order_time, IDENTITY(t2.customer) as customer_id')
      ->from(\App\Entity\Order::class, 't2')
      ->groupBy('t2.customer');

// 关联子查询结果,同时匹配客户ID和最新订单时间,确保拿到的是每个客户的最新记录
$qb->join(
    '(' . $subQb->getDQL() . ')',
    't3',
    \Doctrine\ORM\Query\Expr\Join::WITH,
    't1.date = t3.max_order_time AND IDENTITY(t1.customer) = t3.customer_id'
);

// 后续可正常添加任意where条件,示例:
// $qb->andWhere('t1.pay_status = :paid')
//    ->setParameter('paid', 1)
//    ->orderBy('t1.date', 'DESC');

注意事项

  • 你之前的写法错误原因是仅做了时间大小比较,没有按客户维度分组匹配,也没有取最大值的逻辑,所以只有部分结果符合预期
  • 如果你订单表的时间字段名为timestamp,直接替换代码中所有date为timestamp即可;如果客户字段是直接存储的物理字段而非关联对象,去掉IDENTITY()函数直接写字段名即可
  • 该写法完全复刻了你提供的原生SQL逻辑,执行效率和原生SQL一致,同时完全支持后续添加andWhere/orWhere/orderBy等任意查询构造器方法

内容的提问来源于stack exchange,提问作者Tom Doolan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:27:03