【问题标题】:Subclass Doctrine 2 entity子类学说 2 实体
【发布时间】:2016-06-16 14:02:45
【问题描述】:

我正在尝试对 Doctrine 2 实体进行子类化,以添加一堆我想使用的“帮助”功能。

例如,这是我的实体:

namespace Project\Entity;
class Product
{
    private $name;
    private $idProductCategory;
}

映射是通过 XML 文件完成的。

然后,我尝试扩展它:

namespace Project\Entity;
class ProductJSON extends Product {
    public function toJSON() {
        /* ... */
    }
}

当我尝试在 Doctrine 中使用这个对象时:

$a = $entityManager->getRepository('\Project\Entity\ProductJSON');

我收到“找不到名为 Project.Entity.ProductJSON.dcm.xml 的映射文件”错误。 这是完全正确的,因为我不想要任何额外的映射。

我已广泛阅读 Doctrine 文档和有关映射的超类 (Doctrine: extending entity class),但据我了解,这是为了在 DB 意义上扩展实体。

我不关心数据库/映射,我只想扩展实体 PHP 以在我的应用程序中无缝使用对象。

如何实现这个目标?

【问题讨论】:

  • 只是您的示例错误还是您实际上错过了extends Product 声明?
  • 只是在示例中丢失。编辑谢谢。

标签: php symfony doctrine-orm doctrine subclass


【解决方案1】:

您不需要子类来添加其他方法。只需将方法添加到您的实体类 - Doctrine 将忽略它们,因为它们没有附加映射信息。

例如

class Product
{
    private $name;
    private $idProductCategory;

    /* ... */

    public function toJSON() {
        /* ... */
    }
}

【讨论】:

  • 但是如果我迁移并重新生成实体会怎样?我会丢失我所做的所有更改,对吗?
  • “迁移并重新生成”是什么意思?通常 Doctrine 从您的实体类代码生成数据库模式,而不是相反 - 但也许我误解了您的问题。
  • 如上所述,我将 XML 用于架构或“数据映射”,因此如果我更改该架构,请将数据库迁移到它并重新生成实体(doctrine:mapping:convert annotation ./path-to-src,doctrine:generate:entities)我'我会失去我所做的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多