Doctrine имеет множество досадных ограничений, и вы столкнулись с одним из самых неприятных моментов - отсутствием поддержки подзапросов.
Как говорится, если вы переписываете свой запрос и погружаетесь в источник 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();