gpt4 book ai didi

php - 在Doctrine中使用MAX()子查询

转载 作者:行者123 更新时间:2023-11-29 10:01:04 24 4
gpt4 key购买 nike

我正在尝试将以下本机sql查询转换为Doctrine 2的querybuilder实例,但没有成功。

SELECT r1.*
FROM reservations r1
INNER JOIN (
SELECT user, max(occurrence) AS max
FROM reservations
WHERE team = 'team-id'
AND canceled = 0
GROUP BY user
) r2
ON r1.occurrence = r2.max AND r1.user = r2.user
WHERE r1.team = 'team-id'
AND r1.canceled = 0
AND r1.occurrence >= '2018-10-08'
ORDER BY occurrence DESC;


我曾尝试在使用 INNER JOIN的同时创建查询生成器,但这是不可能的,因为在那一点上不允许子查询。我什至尝试了 ->where($qb->expr()->in()),但是没有用。所以我现在没有选择了。

我要完成的工作是为特定团队中的所有用户保留最新的预订。

可以使用我的经验的人可以帮助我吗?

最佳答案

教义有许多烦人的局限性,而您却遇到了最令人沮丧的问题之一-缺乏对子查询的支持。

话虽如此,如果您重写查询,并深入研究Doctrine源,则有一种解决方法-而是创建一个自我联接。

必须实例化您自己的Join实例并将其添加到构建器,因为您不太可能在Reservation实体上定义必要的关系才能使用已定义的关系。

以下内容未经测试,因为您没有提供表架构或任何示例数据,但是理论已经存在,并且过去我使用类似的查询来解决该问题。

// ReservationRepository.php

use AppBundle\Entity\Reservation;
use Doctrine\ORM\Query\Expr\Join;

return $this->createQueryBuilder('r')
->add('join', [
new Join(Join::LEFT_JOIN, Reservation::class, 'r1', 'WITH', 'r.user = r1.user AND r.team = r1.team AND r1.canceled = :canceled AND r.occurrence < r1.occurrence')
], true)
->where('r.team = :team')
->andWhere('r.canceled = :canceled')
->andWhere('r.occurrence >= :occurrence')
->andWhere('r1.id IS NULL')
->orderBy('r.occurrence', 'DESC')
->setParameter('team', $team)
->setParameter('canceled', 0)
->setParameter('occurrence', '2018-10-08')
->getQuery()
->getResult();

关于php - 在Doctrine中使用MAX()子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52955789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com