Symfony Tips?Criteria ????????? OUTER JOIN ??????
Posted by ~Ray @ 2007-10-17 14:35:18
$crit->addJoin( $left_column. $alter_column, Criteria::LEFT_connect );$crit->addJoin( $left_column. $alter_column, Criteria::RIGHT_connect );
$crit->addJoin( TableAPeer::alias( ‘a’. TableAPeer::KEY1 ), TableBPeer::alias( ‘b’. TableBPeer::KEY1 ), Criteria::LEFT_JOIN )->addJoin( TableAPeer::alias( ‘a’. TableAPeer::KEY2 ), TableBPeer::alias( ‘b’. TableBPeer::KEY2 ), Criteria::LEFT_JOIN );
のようにしたが、LEFT_JOIN で追加した2つの条件式がうまくまとまらず、2つの LEFT_connect として展開されてしまう。(Oracle10g使用時に確認)
$crit->addJoin( TableAPeer::alias( ‘a’. TableAPeer::KEY1 ), TableBPeer::alias( ‘b’. TableBPeer::KEY1 )) ->addJoin( TableAPeer::alias( ‘a’. TableAPeer::KEY2 ), TableBPeer::alias( ‘b’. TableBPeer::KEY2 ));
のような指定となり、展開後のSQLでは on句 は生成されず、以下のような形となる。
on 句が生成されず、where条件として追加される場合は、結合条件が増えても問題ないため期待通りの動作をしてくれる。
気になったため Symfony のソースを追いかけてみたところ、
の createSelectSql メソッドに以下のような記述が見つかった。(改行は一部訂正)
connect の ON句の部分のSQLを生成する部分のようだが、見たところでは ON に指定できるのは(A = B)のような1カラム分の等式だけのようだ。
// build the conditionif ($ignoreCase) { $instruct = $db->ignoreCase($join->getLeftColumn()) . ‘=’ . $db->ignoreCase($join->getRightColumn());} else { $instruct = $join->getLeftColumn() . ‘=’ . $join->getRightColumn();}
// add ‘em to the queues. if ($joinType = $join->getJoinType()) { if (!$fromClause) { $fromClause[] = $leftTable. $leftTableAlias; } $joinTables[] = $rightTable. $rightTableAlias; $joinClause[] = $join->getJoinType() . ‘ ‘ . $rightTable. $rightTableAlias. ” ON ($condition)”;} else { $fromClause[] = $leftTable. $leftTableAlias; $fromClause[] = $rightTable. $rightTableAlias; $whereClause[] = $condition;}
$crit->addJoin( TableAPeer::alias( ‘a’. TableAPeer::KEY1 ), TableBPeer::alias( ‘b’. TableBPeer::KEY1 ) . ‘(+)’) ->addJoin( TableAPeer::alias( ‘a’. TableAPeer::KEY2 ), TableBPeer::alias( ‘b’. TableBPeer::KEY2 ) . ‘(+)’ );
で一時回避。根本的に治すには BasePeer php の createSelectSql メソッドから直すしかなさそうだ。 [ADVERTHERE]Related article:
http://blog.gnetworks.co.jp/nk2/?p=50
0 Comments:
No comments have been posted yet!
|