Symfony 原则:如何使用查询生成器进行嵌套查询?

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

晚上好

在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 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