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テーブルは一度しか呼ばれず、送り手と受け手が同一のレコードを取得する、という結果になってしまう。