在我的学说模型中,我希望有一个具有所有数据库持久化字段的BasePerson
类。
* @ORMEntity()
class BasePerson
{
$street;
$number;
...
}
我还想有一个从基人类扩展而来的Person
类,该类还附加了一个实体侦听器。侦听器触发 API 调用,并用位置数据填充我的"人员"实体。
* @ORMEntity()
* @ORMEntityListeners({"..."})
class Person extends BasePerson
{
$location;
}
对于所有不需要 API 调用的基本操作,我想使用BasePerson
类,对于所有与 API 相关的操作,我将使用Person
类;但在每种情况下,我至少都有来自数据库的信息。
现在的问题是,每当我向两个实体添加@ORMEntity()
注释时,Doctrine认为这应该是两个表。我不想要两张桌子。如果我将实体注释留在两个实体之一上,学说会给我一个错误,即这个实体是不受管理的......
如何将所有内容放在一个表中?我读过关于单表继承的信息,但为此,学说将使用鉴别器列来管理它......但这不是我打算的用例...
要获得干净的体系结构,应使用相同的实体和两个 DTO。一个用于 API 并添加属性"位置",另一个用于项目的其他视图。
原则(版本>= 2.4)可以使用"NEW"运算符直接从查询返回 DTO,例如:
<?php
$this
->get('doctrine.orm.entity_manager')
->createQueryBuilder()
->select('NEW AcmeDTOCategoryListView(category.id, category.title)')
->from('AcmeDemoBundle:Category', 'category');
您可以在 Person 类中拥有一些与 API 相关的方法,并仅在需要时使用它们。我不明白为什么这会是一个问题。
我认为你不应该直接使用BasePerson类。 我认为教义不会允许你试图拥有的行为。