relationのないテーブルをleft joinする。
最近symfony絡みのバッドノウハウばっかりだな・・・
海外サイトでもソリューションが見つからなかったけど良く考えたらできたのでメモ。
keyword: doctrine left join without relation
symfony/doctrineでleftJoinを使うには、テーブル間にrelationが必要になる。
しかし、relationをschema.ymlやDoctrine_Record::setUpで定義してしまうと、
symfony doctrine:build --all
などとしたときに外部キー制約が設定されてしまう。
今回は、集計したログの値を基にorderByを発行したかった。
あくまでログなので外部キー制約は付けたくない。
でもleft joinはしたい。
そんなときは
実行コンテキストでrelationしちゃえばいいじゃなーい!
// in some Doctrine_Table class $this->bind( array('SomeLog as SomeLogs', array( 'local' => 'id', 'foreign' => 'record_id', )), Doctrine_Relation::MANY // means hasMany ); $this->createQuery('r')->select('r.*') ->leftJoin('r.SomeLogs as l') ->orderBy('SUM(l.weight) DESC') ->execute();
これでschemaを汚染せず、リクエストコンテキストでのみrelationが付く。
というわけで
(’・ω・`)はいはいBKBK