【问题标题】:Doctrine inheritance with only one table possible?只有一张表的教义继承?
【发布时间】:2018-03-23 09:42:38
【问题描述】:

在我的 Doctrine 模型中,我想要一个 BasePerson 类,其中包含所有数据库持久字段。

 * @ORM\Entity()
class BasePerson 
{
   $street;
   $number;
   ...
}

我还希望有一个Person 类从基础人员类扩展而来,该类还附加了一个实体侦听器。侦听器触发 API 调用并用位置数据填充我的“Person”实体。

 * @ORM\Entity()
 * @ORM\EntityListeners({"..."})
class Person extends BasePerson 
{
  $location;
}

对于所有不需要 API 调用的基本操作,我想使用 BasePerson 类,对于所有与 API 相关的操作,我将使用 Person 类;但在每种情况下,我至少都有来自数据库的信息。

现在的问题是,每当我向两个实体添加 @ORM\Entity() 注释时,Doctrine 认为这应该是两个表。我不想要两张桌子。如果我将实体注释留在两个实体之一上,则学说会给我一个错误,即该实体是非托管的...

我怎样才能把所有东西都放在一张桌子上?我阅读了有关单表继承的信息,但为此,学说将使用鉴别器列来管理它......但这不是我想要的用例......

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    要拥有一个干净的架构,您应该使用相同的实体和两个DTOs。一个用于 API 并将其添加属性“位置”,另一个用于项目的其他视图。

    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');
    

    【讨论】:

    • 是否会使用基于同一实体的 DTO 层阻止调用 EntityListener?我不这么认为......或者你将如何使用 DTO 来管理这个?
    • Doctrine 可以直接从查询中返回一个 DTO,例如:$this -&gt;get('doctrine.orm.entity_manager') -&gt;createQueryBuilder() -&gt;select('NEW Acme\DTO\CategoryListView(category.id, category.title)') -&gt;from('AcmeDemoBundle:Category', 'category');
    • 我无法想象如何将 DTO 想法与我的应用程序结合起来......我正在使用想要一个实体使用的奏鸣曲管理员。我无法将 DTO 注入到我的管理服务中。
    • 假设 BasePerson 拥有一个 Adress-Entity ... 我如何通过 SELECT NEW ... 查询获取它?当我加入相关实体(“SELECT NEW PersonDTO(p.street, p.number, a) FROM Person JOIN p.address a”)时,我的 PersonDTO 构造函数中出现错误,该构造函数接收“int”而不是输入“地址”
    • 好的,我在网上找到了这个stackoverflow.com/questions/29004687/… ...似乎只有将标量值传递给构造函数...这就是为什么 DTO 方法不适合我的需要的原因。 ..
    【解决方案2】:

    您可以在您的 Person 类中只使用一些与 API 相关的方法,并仅在需要时使用它们。我不明白为什么会有这样的问题。

    我认为您不应该直接使用 BasePerson 类。 我认为 Doctrine 不会允许您尝试的行为。

    【讨论】:

    • 我遇到的问题是,每当我使用 entitylistener 加载类时,都会执行我的 api 调用。但是有很多情况我不想调用 api 调用。可以说我只想要我的人的街道。在这种情况下,不需要获取实际位置......所以我的想法是使用两个类......一个用于来自本地数据库的简单信息,以及每当我需要 api 信息时的扩展版本
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2015-12-21
    • 2023-04-08
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多