В построителе DBAL запросов Doctrine некоторые объединения - PullRequest
2 голосов
/ 07 сентября 2011

КОД PHP:

    $xCodesQueryBuilder = $conn->createQueryBuilder();

    $xCodesQueryBuilder->select("l.id","mdsh.xcode","mdso.xcode")
            ->from("location_tree","l")
            ->join("l","location_tree_pos","p","l.id = p.tree_id")
            ->rightJoin("l","hotel","h","h.location_id = l.id")
            ->leftJoin("l","offer_location","ol","l.id=ol.location_id")
            ->leftJoin("ol","mds_offer","mdso","ol.offer_id = mdso.offer_id")
            ->leftJoin("h","mds_hotel","mdsh","h.id = mdsh.hotel_id")
            ->where("p.parent_id IN (:ids)")
            ->andWhere("(mdso.xcode IS NOT NULL OR mdsh.xcode IS NOT NULL)");

    var_dump($xCodesQueryBuilder->getSQL());exit;

РЕЗУЛЬТАТ:

SELECT l.id, mdsh.xcode, mdso.xcode
FROM location_tree l 
INNER JOIN location_tree_pos p ON l.id = p.tree_id 
RIGHT JOIN hotel h ON h.location_id = l.id 
LEFT JOIN offer_location ol ON l.id=ol.location_id 
WHERE (p.parent_id IN (:ids)) 
AND ((mdso.xcode IS NOT NULL OR mdsh.xcode IS NOT NULL))

Есть идеи, почему пропущены 2 последних объединения?

Ответы [ 2 ]

3 голосов
/ 26 сентября 2011

Я только что получил это для меня. Пришлось изменить функцию getSQLForSelect() в QueryBuilder.php.

Я открыл тикет и отправил запрос на извлечение в DBAL, но в то же время не стесняйтесь использовать мою пропатченную копию .

UPDATE:

Только что понял, что альтернативный способ решения этой проблемы - всегда использовать псевдоним таблицы FROM в качестве первого аргумента ($fromAlias) в любом из join() методов.

В вашем случае вы изменили бы свой код так:

$xCodesQueryBuilder = $conn->createQueryBuilder();

$xCodesQueryBuilder->select("l.id","mdsh.xcode","mdso.xcode")
        ->from("location_tree","l")
        ->join("l","location_tree_pos","p","l.id = p.tree_id")
        ->rightJoin("l","hotel","h","h.location_id = l.id")
        ->leftJoin("l","offer_location","ol","l.id=ol.location_id")
        ->leftJoin("l","mds_offer","mdso","ol.offer_id = mdso.offer_id")
        ->leftJoin("l","mds_hotel","mdsh","h.id = mdsh.hotel_id")
        ->where("p.parent_id IN (:ids)")
        ->andWhere("(mdso.xcode IS NOT NULL OR mdsh.xcode IS NOT NULL)");

var_dump($xCodesQueryBuilder->getSQL());exit;
0 голосов
/ 04 января 2013

Я думаю, что Doctrine 2.3.1 поддерживает это.

Обходным путем может быть преобразование соединений в откуда и куда, при необходимости используйте group by.Застрял на 2-3 часа, наконец использовал этот обходной путь, потому что даже после обновления мне это не помогло (пытаясь выяснить, почему)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...