doSelectJoinAll():同じテーブルに複数の外部キーを張るとき適切なSQL文を生成できない

関数そのものに関しては
http://symfony.xrea.jp/1.0/book/18-Performance.html#minimizing.the.number.of.queries.with.joins
を参照

解決策

以下の方策は諦めました!!無理!
結局生のSQLを発行することに決定。
SQL文にカラム名が被ってるものにことごとくASで別名を設定。取得した内容を配列に持たせて、Viewに渡すという結果になりました。


まだ途中ですが、
・テーブルに別名を設定する。

  • >doSelectJoinAll()のオーバーライド
  • >actionの変更
  • >templateの変更

例えばこんな場合

  • schema.yml
propel:
  mail:
    _attributes:         { phpName: Mail }
    id:
    from_user_id:
      type:              integer
      foreignTable:      user
      foreignReference:  id
    to_user_id:
      type:              integer
      foreignTable:      user
      foreignReference:  id
  user:
    _attributes:         { phpName: User }
    id:
    name:
      type:              varchar(255)

mailテーブルとuserテーブルの間には2つの外部キーがある。
あるメールの送り手と受け手を、どちらもユーザーテーブルと関連付けている。

これをactionで

MailPeer::doSelectJoinAll(new Criteria());

みたいに呼ぶときに期待する結果は、from_user_idとto_user_idそれぞれに対してidに対応したユーザーを別々に取得することだと思われるが、発行されるSQL

SELECT mail.ID, mail.FROM_USER_ID, mail.TO_USER_ID, 
       user.ID, user.NAME 
FROM entry, user, category, file_list 
WHERE mail.from_user_id=user.ID
 AND mail.to_user_id=user.ID

こんな感じ。
つまり、userテーブルは一度しか呼ばれず、送り手と受け手が同一のレコードを取得する、という結果になってしまう。