我正在嘗試PHP的Doctrine ORM(v1.2)。我已經定義了一個班級「酒」,有兩個孩子班「杜松子酒」和「威士忌」。我使用具體繼承(大多數文獻中的類表繼承)將類映射到三個獨立的數據庫表。PHP教條1.2 ORM - 具有類表繼承的多態查詢
我試圖執行以下操作:
$liquor_table = Doctrine_Core::getTable('liquor');
$liquors = $liquor_table->findAll();
最初,我預計$酒是包含所有酒類一個Doctrine_Collection,無論是威士忌或杜松子酒。但是當我執行代碼時,儘管在威士忌和杜松子酒數據庫表中有幾行,但我仍然得到一個空的集合。根據生成的SQL,我明白爲什麼:ORM查詢的是「酒」表,而不是存儲實際數據的威士忌酒/杜松子酒表。
請注意,當我將繼承類型切換爲列聚合(簡單表繼承)時,代碼完美工作。
什麼是獲得包含所有酒類的Doctrine_Collection的最佳方式?
更新
一些調查研究後,它看起來像我期待學說被執行幕後SQL UNION
操作的結果集從「威士忌」和「晶晶」表結合起來。
這被稱爲多態查詢。
根據this ticket,該功能在Doctrine 1.x中不可用。它註定要發佈到2.0。 (另請參閱CTI的Doctrine 2.0文檔)。
因此,根據這些信息,解決這個不足的最簡潔,最有效的方法是什麼?切換到單個表繼承?執行兩個DQL查詢並手動合併得到的Doctrine_Collections?