使用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
相关产品推荐
相关产品推荐

