首页 > 解决方案 > Symfony 4 中的自定义基础实体

问题描述

我正在使用 Symfony 4 和 Doctrine,其中我的实体具有相同的公共属性,例如 createdWhen、editedWhen、...

我想做的是:

定义一种包含这些公共属性并实现 setter 和 getter 的基本实体。以及从该基础实体继承的许多实体。数据库字段应全部定义在相应子实体的表中(不应在数据库中创建超表等)。

例子:

/**
 * @ORM\Entity(repositoryClass="App\Repository\BaseRepository")
 */
class Base
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=127, nullable=true)
     */
    private $createdWhen;

    // Getter and setter
    ...
}


/**
 * @ORM\Entity(repositoryClass="App\Repository\PersonRepository")
 */
class Person extends Base
{
    /**
     * @ORM\Column(type="string", length=127, nullable=true)
     */
    private $name;

    // Getter and setter
    ...
}

/**
 * @ORM\Entity(repositoryClass="App\Repository\CarRepository")
 */
class Car extends Base
{
    /**
     * @ORM\Column(type="string", length=127, nullable=true)
     */
    private $brand;

    // Setter and getter
    ...
}

这应该创建表“person”和“car”(每个都有 id,created_when)但没有表基。

我仍然希望能够使用 bin/console make:migration 来更新数据库模式。

Symfony 4 可以实现这种方法吗?如果是,我将如何定义实体以及我必须在配置等方面进行哪些更改?

标签: symfonydoctrinesymfony4

解决方案


您正在寻找实体继承

像这样重写你的代码

/** @MappedSuperclass */
class Base
{
...
}

实际上,这是Doctrine的一部分,这是官方文档所说的

映射的超类是一个抽象或具体的类,它为其子类提供持久的实体状态和映射信息,但它本身不是实体。通常,这种映射超类的目的是定义多个实体类共有的状态和映射信息。


推荐阅读