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