DoctrineのO/RマッピングでO/Rマップができない?
2009年05月07日(木)09:36|天方
こんにちは 天方です。
前回は、Symfony1.2のDoctrineの文字列長チェックではまったポイントについて紹介しましたが今回は、DoctrineのO/Rマッピングにハマりましたので紹介したいと思います。
それはズバリ、O/Rマッピングが期待通りにされないというものです。(ぐは)
では、問題のコードを見てみましょう。
$userProfiles = Doctrine_Query::create()
->from('UserProfile up')
->where('up.is_active = ?', true)->execute();
これは、UserProfileテーブルのis_active = trueである レコードの配列を取得する処理です。
ここで取得される結果の$userProfilesには Doctrineで自動生成されたUserProfileクラスの配列が 入るだろうと思いきや、そうではないというのが問題です。 (この記述ではDoctrineのRecordオブジェクトの配列が格納されます!)
これがなぜ問題になるかというと、 UserProfileクラスを開発者がカスタマイズしても、Doctrineの結果セットとして 利用できないということです。これでは、O/Rマッピングの意味がありません。
結果セットでUserProfileのオブジェクトを返してもらうには、以下のようにすればいいようです。
$userProfiles = Doctrine::getTable('UserProfile')
->createQuery('up')
->where('up.is_active = ?', true)->execute();
これだけのことですが、Symfonyのチュートリアルをみると 最初の記述方法が一般的で、後者の解説している箇所が見当たりませんでした。
(設計の意図として、前者がRecordオブジェクトになるのは意味があるのですが、説明がないとわからないです…)
Symfony1.2のチュートリアルにはこういったハマりポイントがちらほらあるので、いろいろな文献を見ながら勉強していく必要がありそうです。