この質問は、複数のテーブル、結合、Doctrine2、ResultSetMapping、DQL などからのデータの選択に関するものです。
私は4つのテーブルを持っています:
- ユーザー
- コンタクト
- contact_phone
- 電話
画像に示すような関係: http://i.stack.imgur.com/762Jw.png
各ユーザーは多くの連絡先を持つことができ、各連絡先は多くの電話を持つことができ、各ユーザーは自分の連絡先との間で多くの通話を行うことができます。現実の世界と同じように...わかりやすくするために、各テーブルのフィールド数を制限しています。
したがって、私の問題は、特定のユーザーの通話のリストを表示するときに、電話番号を連絡先名に正確にマップする方法がわからないことです。
ユーザー1のすべての通話を一覧表示する場合は、次のようにします。
$callRepository = $this->getDoctrine()->getRepository('MyBundle:Call');
$calls = $callRepository->findAll(array('user' => 1));
ただし、これにより、このユーザーのすべての通話のリストが表示され、番号 (call.number) が名前 (contact.name) に関連付けられません。
このクエリを使用して、プレーン SQL で目的を達成できます。
SELECT
c.number,
contact.name
FROM
`call` c
JOIN contact_phone cp ON
cp.number = c.number
JOIN contact ON
contact.id = cp.contact_id
WHERE
c.user_id = contact.user_id
AND c.user_id = 1
すべての呼び出しを (SQL を使用して) 選択してから、PHP レイヤーからの別のクエリを使用して番号を名前にマップしたくないことに注意してください。この方法では、名前で呼び出しを検索することはできません。
この場合、ResultSetMapping が役立つと考えていましたが、SQL クエリと ResultSetMapping を組み合わせることができませんでした。
助けてください、ありがとう!