为了账号安全,请及时绑定邮箱和手机立即绑定

我是否以正确的方式设计我的 Symfony 实体?

我是否以正确的方式设计我的 Symfony 实体?

PHP
撒科打诨 2023-08-06 15:40:26
我有一个名为“产品”的通用实体,它有一些简单的字段,例如名称、描述和价格。我想使用它作为基础实体,以便我可以基于此产品实体创建具有完全相同字段的其他实体。我可以轻松复制整个实体类和存储库文件并将它们重命名为 Product1、Product1Repository 等,但我觉得这会重复很多代码。我肯定需要处理实体的副本,向我的数据库设计添加另一个属性/列将无法满足我想要做的事情。扩展或继承此类的最佳方法是什么,以便 Product2、Product3、ProductN 类可以作为准系统类存在,只继承 Product1 的所有内容,并且还具有相应的 Doctrine 存储库?我需要做什么才能实现这个目标?这是我到目前为止的代码:<?phpnamespace App\Entity;use App\Repository\ProductRepository;use Doctrine\ORM\Mapping as ORM;/** * @ORM\Entity(repositoryClass=ProductRepository::class) */class Product{    /**     * @ORM\Id()     * @ORM\GeneratedValue()     * @ORM\Column(type="integer")     */    private $id;    /**     * @ORM\Column(type="string", length=255)     */    private $name;    /**     * @ORM\Column(type="string", length=255)     */    private $description;    /**     * @ORM\Column(type="string", length=255)     */    private $price;//Getters and setters here...谢谢你!
查看完整描述

2 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

为什么不让你的基础实体产品变得抽象呢?那么你所有的其他产品都可以扩展它吗?


抽象的:


/**

 * @ORM\Entity(repositoryClass=ProductRepository::class)

 */

abstract class Product

{

产品1:


/**

 * @ORM\Entity(repositoryClass=Product1Repository::class)

 */

class Product1 extends Product

{


查看完整回答
反对 回复 2023-08-06
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

您可以从 Doctrine 文档中检查类表继承。

基本上,您使用子实体共有的所有字段创建基本实体,然后创建一个鉴别器列并映射该列可以具有的值,这些值将映射到您的子实体。

<?php

namespace MyProject\Model;


/**

* @Entity

* @InheritanceType("JOINED")

* @DiscriminatorColumn(name="discr", type="string")

* @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})

*/

class Person

{

    // ...

}


/** @Entity */

class Employee extends Person

{

    // ...

}

通过这种方式,您将拥有一个 Person 表,其中包含名为“discr”的列以及您声明的所有其他字段;和一个名为 Employee 的表,其中 Person.id 作为主键,Person 的外键,加上您在“Employee”实体中声明的所有字段。


查看完整回答
反对 回复 2023-08-06
  • 2 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信