Symfony 4 中的自定义基本实体

1 doctrine symfony symfony4

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

我想做的是:

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

例子:

/**
 * @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
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Lun*_*man 6

您正在寻找实体继承

像这样重写你的代码

/** @MappedSuperclass */
class Base
{
...
}
Run Code Online (Sandbox Code Playgroud)

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

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