Symfony 原则:如何使用查询生成器进行嵌套查询?
晚上好 在SQL查询和条令查询生成器方面,我仍然是一名初级。 我的问题很简单,我已经搜索了几个小时了 我在一个symfony 4.4 LTS项目中。 我有一个表格,代表电子商务网站上的订单。共有4个字段:id、custommer\u id、created\u at、status 我想要的是: 最近20个状态为'new'且ID为后代的订单 如果我进行SQL查询Symfony 原则:如何使用查询生成器进行嵌套查询?,symfony,doctrine-query,Symfony,Doctrine Query,晚上好 在SQL查询和条令查询生成器方面,我仍然是一名初级。 我的问题很简单,我已经搜索了几个小时了 我在一个symfony 4.4 LTS项目中。 我有一个表格,代表电子商务网站上的订单。共有4个字段:id、custommer\u id、created\u at、status 我想要的是: 最近20个状态为'new'且ID为后代的订单 如果我进行SQL查询 SELECT * FROM order o WHERE o.status = 'new'. ORDER BY o.created_at
SELECT *
FROM order o
WHERE o.status = 'new'.
ORDER BY o.created_at DESC, o.id DESC
limit 20
这是一个失败,因为我没有按降序获取ID。我仍然难以理解为什么
最后,我在SQL中找到了这个解决方案:
SELECT *
FROM
(
SELECT *
FROM order o
WHERE o.status = 'new'.
ORDER by created_at DESC
LIMIT 20
) table_order
ORDER by id DESC
酷!!我通过降序ID获取最后20条命令
现在我要用Doctrine的createQueryBuilder来做。
我尝试了很多解决方案,但都没有成功。
你能帮帮我吗?
提前感谢假设您的实体类具有名称订单:
$orders = $entityManager
->createQueryBuilder()
->from(Order::class, 'o')
->select('o')
->where('o.status = :newStatus')
->setParameter('newStatus', 'new')
->orderBy('o.created_at', 'DESC')
->addOrderBy('o.id', 'DESC')
->getQuery()
->setMaxResults(20)
->getResult();
但有了DQL,它就更好了:
$orders = $entityManager
->createQuery('
SELECT o
FROM App\Entity\Order o
WHERE o.status = :newStatus
ORDER BY
o.created_at DESC AND
o.id DESC
')
->setParameters(['newStatus' => 'new'])
->setMaxResults(20)
->getResult();
通过
date
或id
获取最后20个订单几乎是一样的
订单越晚,id越大
如果在10:32:17
下的订单id为59
,然后在这之后下订单,比如说在
10:32:29
,将明显获得id
60
除非您收到的订单太多,以至于它们在同一秒钟内发生,按其
日期
或id
排序是相同的
只需按id
订购即可:
公共函数getLastNewOrders(){
$qb=$this->_em->createQueryBuilder();
$qb->选择(“订单”)
->from(Order::类,“Order”)
->andWhere($qb->expr()->eq(“订单状态”,“新”)
->orderBy(“order.id”、“DESC”)
->setMaxResults(20);
返回$qb->getQuery()->getResult();
}
非常感谢您的明确回答。 我的帖子不够精确。 把它放在上下文中,这是在我第一份工作的技术测试上下文中 我收到了一个带有固定装置的symfo项目。 当我运行fixture时,我在“Order”表中得到了非常不一致的数据。也就是说,您在选择按ID排序或创建时提出的精确逻辑无法保留。 让我解释一下: 查看顺序表中的最后9条命令。查看ID,它们的顺序非常不一致。 这样做是为了让测试更复杂吗?我不知道 ! 如果我将表order的最后5个订单减少到status='new',我会得到以下结果: ! 我被要求按降序ID对它们进行排序,所以我想得到: ! 因此,您提出的解决方案不会按ID降序排列 炖牛肉: 你向我提议:
$orders = $entityManager
->createQueryBuilder()
->from(Order::class, 'o')
->select('o')
->where('o.status = :newStatus')
->setParameter('newStatus', 'new')
->orderBy('o.created_at', 'DESC')
->addOrderBy('o.id', 'DESC')
->getQuery()
->setMaxResults(20)
->getResult();
我明白了,所以不好
!
对于这样的sql请求,这很好:
SELECT *
FROM
(
SELECT *
FROM order o
WHERE o.status = 'new'.
ORDER by created_at DESC
LIMIT 20
) table_order
ORDER by id DESC
但我不能用QueryBolder
非常感谢您的时间。@Sammum这有什么关系吗?他使用ID,而不是UUID。解决方案本身很简单,按日期排序,而不是按首字母排序是一个品味问题。我想正确的方法是检查createdAt