Doctrine 2 / MySQL: возникли проблемы с преобразованием левых соединений SQL в левые соединения DQL - PullRequest
0 голосов
/ 12 ноября 2011

Итак, цель моего SQL - получить квартиры и некоторую информацию о них.

Это SQL:

SELECT apartment.id, AVG(review.staff), COUNT(distinct review.id), city.name as city_name, state.state as state_name,
    MIN(room.price_per_night)
FROM room
    LEFT JOIN apartment ON room.apartment_id=apartment.id
    LEFT JOIN review ON room.apartment_id=review.apartment_id
    LEFT JOIN city ON apartment.city_id = city.id
    LEFT JOIN state ON city.city_state_id = state.id
GROUP BY apartment.id;

который работает.

Но когда я пытаюсь включить DQL, все идет хорошо, пока я не попытаюсь присоединиться к таблице обзора:

    $qb = $em->createQueryBuilder('c');

    $qb->select("MIN(r.price_per_night), rev.id")
       ->from("TechforgeApartmentBundle:Room", 'r')
       ->leftJoin('r.apartment', 'a')
       ->leftJoin('Review', 'rev', \Doctrine\ORM\Query\Expr\Join::WITH, 'r.apartment = rev.apartment')
       ->groupBy('a.id');

Всегда жалуется на то, что Отзыв не был идентифицирован ранее:

[Семантическая ошибка] строка 0, столбец 116 рядом с 'rev WITH r.apartment': Ошибка: Проверка переменных идентификации использовалась в выражении пути соединения, но была не определено ранее.

Я много пробовал, и, похоже, ничто не помогло.

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

Я почти уверен, что вы можете отменить условие WITH, при условии, что у Apartment и Review есть сопоставленная ассоциация.

$qb->select('MIN(r.price_per_night), rev.id')
   ->from('TechforgeApartmentBundle:Room', 'r')
   ->leftJoin('r.apartment', 'a')
   ->leftJoin('a.review', 'rev')
   ->groupBy('a.id');

Если по какой-то причине вам нужно условие WITH, синтаксис выглядит следующим образом:

->leftJoin('a.review', 'rev', 'WITH', 'a.id = rev.apartment_id')
0 голосов
/ 13 декабря 2011

Я решил это с помощью необработанных запросов sql:

        $em = $this->getDoctrine()->getEntityManager();
        $stmt = $em->getConnection()
                   ->prepare("...
             ");
        $stmt->execute();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...