2011-09-07 52 views
2

PHP代码:主义的DBAL查询生成器omitts一些加入

$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个连接被省略?

+0

一些reaseon每个第一个参数加入必须是相同的(“L”的我的情况),然后它的工作。任何人都可以解释这背后的逻辑吗? – Itako

+0

我有同样的问题。只有那些与“FROM”表别名关联的连接才会出现。其他一切似乎都被省略了。 – anushr

回答

3

我刚刚为我工作。必须在QueryBuilder.php中修改功能getSQLForSelect()

我已经打开了一个ticket并向DBAL提交了一个请求,但是在此期间,请随时使用my patched copy

UPDATE:

刚刚意识到解决这个问题的另一种方法是始终使用FROM表的别名在任何join()方法的第一个参数($fromAlias)。

在你的情况,你会改变你的代码看起来像这样:

$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

我想学说2.3.1支持这一点。

解决方法可能会将连接转换为来自哪里,如果需要使用分组。 卡住了2-3小时,最后用这个解决办法 因为即使升级后不帮我(试图找出原因)