可能只有一个表的主义继承?

时间:2018-03-23 09:42:39

标签: php symfony doctrine-orm

在我的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将使用一个鉴别器列来管理它......但这不是我想要的用例...

2 个答案:

答案 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不会允许你尝试的行为。