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