выберите, где левый столбец равен нулю в доктрине - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь выбрать все комнаты, которые не заняты в указанные даты бронирования. Я создал такой код:

$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 комнаты, где идентификатор комнаты равен идентификатору бронирования:

  1. 2000-01-01 - 2000-01-02
  2. 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
                )
            );
...