我正在试验 PHP 的 Doctrine ORM (v1.2)。我已经定义了一个类“酒”,有两个子类“杜松子酒”和“威士忌”。我正在使用具体继承(大多数文献中的类表继承)将类映射到三个单独的数据库表。
我正在尝试执行以下操作:
$liquor_table = Doctrine_Core::getTable('liquor');
$liquors = $liquor_table->findAll();
最初,我希望 $liquors 是一个包含所有酒的 Doctrine_Collection,无论它们是威士忌还是杜松子酒。但是当我执行代码时,我得到一个空集合,尽管威士忌和杜松子酒数据库表中有几行。根据生成的 SQL,我明白了原因:ORM 正在查询“酒”表,而不是存储实际数据的威士忌/杜松子酒表。
请注意,当我将继承类型切换为列聚合(简单表继承)时,代码可以完美运行。
获得包含所有酒类的 Doctrine_Collection 的最佳方法是什么?
更新
经过一些更多的研究,看起来我期待 DoctrineUNION
在幕后执行 SQL 操作以组合来自“威士忌”和“杜松子酒”表的结果集。
这称为多态查询。
根据这张票,此功能在 Doctrine 1.x 中不可用。它的目标是 2.0 版本。(另见CTI的 Doctrine 2.0 文档)。
那么根据这些信息,解决这个缺陷的最干净、最有效的方法是什么?切换到单表继承?执行两个 DQL 查询并手动合并生成的 Doctrine_Collections?