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