Jos*_*son 15 php doctrine class-table-inheritance
我正在试验PHP的Doctrine ORM(v1.2).我已经定义了一个班级"酒",有两个孩子类"杜松子酒"和"威士忌".我使用具体的继承(大多数文献中的类表继承)将类映射到三个单独的数据库表.
我试图执行以下操作:
$liquor_table = Doctrine_Core::getTable('liquor');
$liquors = $liquor_table->findAll();
Run Code Online (Sandbox Code Playgroud)
最初,我预计$ liquors是一个包含所有酒类的Doctrine_Collection,无论它们是威士忌还是杜松子酒.但是当我执行代码时,我得到一个空集合,尽管在威士忌和杜松子酒数据库表中有几行.基于生成的SQL,我理解为什么:ORM查询"酒"表,而不是存储实际数据的威士忌/杜松子酒表.
请注意,当我将继承类型切换到列聚合(简单表继承)时,代码可以正常工作.
获取包含所有酒的Doctrine_Collection的最佳方法是什么?
更新
经过一些研究后,看起来我期待Doctrine UNION在幕后执行SQL 操作来组合"威士忌"和"杜松子酒"表中的结果集.
这称为多态查询.
根据此票证,Doctrine 1.x中不提供此功能.它注定要发布2.0版本.(另见CTI的 Doctrine 2.0文档).
因此,根据这些信息,解决这一缺陷的最简洁,最有效的方法是什么?切换到单表继承?执行两个DQL查询并手动合并生成的Doctrine_Collections?
目前Doctrine唯一稳定且有用的继承模式是column_aggregation。我在不同的项目中尝试过其他的。使用column_aggregation,您可以模仿多态查询。一般来说,继承在 Doctrine (1.x) 中存在一些问题。在 2.x 中,这种情况将会改变,因此我们将来可能有更好的选择。