symfony - 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 可以实现这种方法吗?如果是,我将如何定义实体以及我必须在配置等方面进行哪些更改?
解决方案
您正在寻找实体继承
像这样重写你的代码
/** @MappedSuperclass */
class Base
{
...
}
实际上,这是Doctrine的一部分,这是官方文档所说的
映射的超类是一个抽象或具体的类,它为其子类提供持久的实体状态和映射信息,但它本身不是实体。通常,这种映射超类的目的是定义多个实体类共有的状态和映射信息。
推荐阅读
- python - 为什么 jupyter notebook 和我的烧瓶应用程序中的词云输出不同?
- angular - 角卡导航问题
- python - Vim 正则表达式不创建语法组
- angular - PWA 在 Ionic 5 中的应用程序更新时自动刷新/更新客户端
- reactjs - 如何使用 React JS 发布日期和小时数?
- ios - 颤振:SFSafariViewController 不像原生 iOS 模式那样打开
- c# - XmlSerializer 访问父元素中的子逻辑元素
- azure - ADF 从列中删除换行符
- javascript - 使用不同的 CSS 和图像创建多个构建?
- javascript - Javascipt 流畅的滚动体验