Я пытаюсь выбрать все комнаты, которые не заняты в указанные даты бронирования. Я создал такой код:
$queryBuilder->select('rm')
->from('App:Room', 'rm')
->leftJoin('App:Reservation', 'r', 'WITH', $queryBuilder->expr()->andX(
$queryBuilder->expr()->lt('r.start', '?1'),
$queryBuilder->expr()->gt('r.stop', '?2'),
)
)->where(
$queryBuilder->expr()->andX(
$queryBuilder->expr()->isNull('rm')
)
)->setParameters(
array(
1 => $stop,
2 => $start,
)
);
У меня 2 бронирования на 2 комнаты, где идентификатор комнаты равен идентификатору бронирования:
- 2000-01-01 - 2000-01-02
- 2000-01-01 - 2000-01-03
Также $start = '2000-01-02'
и $stop = '2000-01-05'
Я ожидаю, что с учетом этих дат этот запрос вернет мне комнату 1., так как комната 2 имеет резервирование, сталкивающееся с ними, но результат будет пустым. Удаление предложения where
приводит к возвращению обеих комнат. В этом случае $queryBuilder->getQuery()->getArrayResult()
возвращает как номера, так и номер бронирования 2. как и ожидалось, но когда я восстанавливаю предложение where
, массив просто становится пустым. Посоветуйте, пожалуйста, чего мне не хватает? РЕДАКТИРОВАТЬ:Мой другой подход - использование подзапроса, но он ведет себя точно так же, поэтому я могу неправильно понимать построитель запросов
$queryBuilder = $this->getEntityManager()->createQueryBuilder();
$all = $this->getEntityManager()->createQueryBuilder();
$all->select('ri.id')
->from('App:Room', 'ri')
->innerJoin('App:Reservation', 'r')
->where(
$all->expr()->andX(
$all->expr()->lt('r.start', '?1'),
$all->expr()->gt('r.stop', '?2'),
$all->expr()->neq('r.status', '?3')
)
);
$queryBuilder->select('rif')
->from('App:Room', 'rif')
->where(
$queryBuilder->expr()->neq(
'rif.id',
$queryBuilder->expr()->all(
$all->getDQL()
)
)
)->setParameters(
array(
1 => $stop,
2 => $start,
3 => Reservation::STATUS_EXPIRED
)
);