PHP 用の Doctrine ORM (v1.2) を試しています。クラス「酒」を定義し、2 つの子クラス「ジン」と「ウイスキー」を定義しました。私は具体的な継承 (ほとんどの文献ではクラス テーブルの継承) を使用して、クラスを 3 つの個別のデータベース テーブルにマップしています。
私は次のことを実行しようとしています:
$liquor_table = Doctrine_Core::getTable('liquor');
$liquors = $liquor_table->findAll();
当初、私は $liquors が、ウィスキーであろうとジンであろうと、すべての酒を含む Doctrine_Collection であることを期待していました。しかし、コードを実行すると、whisky および gin データベース テーブルに複数の行があるにもかかわらず、空のコレクションが得られます。生成された SQL に基づいて、理由がわかりました。ORM は、実際のデータが格納されているウイスキー/ジン テーブルではなく、「酒」テーブルをクエリしています。
継承タイプを列集計 (単純なテーブル継承) に切り替えると、コードが完全に機能することに注意してください。
すべての酒類を含む Doctrine_Collection を取得する最良の方法は何ですか?
アップデート
さらに調査した結果、Doctrine がUNION
舞台裏で SQL 操作を実行して、"whisky" テーブルと "gin" テーブルからの結果セットを結合することを期待しているようです。
これは、ポリモーフィック クエリと呼ばれます。
このチケットによると、この機能は Doctrine 1.x では利用できません。これは 2.0 のリリースを予定しています。( CTIの Doctrine 2.0 ドキュメントも参照してください)。
この情報に照らして、この欠陥を回避するための最もクリーンで効率的な方法は何でしょうか? 単一テーブルの継承に切り替えますか? 2 つの DQL クエリを実行し、結果の Doctrine_Collections を手動でマージしますか?