示例:
我们有实体User。对于不同的用户类型,用户具有不同的参数。用户类型"admin"、"manager"、"customer"都有自己的参数集。
如何让工厂成为实体用户?我的意思是结构和函数getTypeParams返回用户类型的参数。
我是如何制作的:
实体用户拥有:
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue
*/
private $id;
/**
* @ORMColumn(type="string", length=10)
*/
private $type;
/**
* @ORMOneToOne(targetEntity="UserTypeAdmin", cascade={"persist", "remove"}, orphanRemoval=true)
* @ORMJoinColumn(name="typeadmin_id", referencedColumnName="id", nullable=true, onDelete="CASCADE")
*/
private $type_admin;
实体UserTypeAdmin为admin设置了参数。
但问题是数据库表中的实体User有列:typeadmin_id、typemanager_id、typecustomer_id。。。其中一列有值,但其他列等于null。
如果用户有一个类型,为什么我们需要为每个类型制作列:用户表中的typeadmin_id、typemanager_id、typecustomer_id?
有什么办法做得漂亮吗?
基本问题是不能让一个属性(类型)指向多个表。至少效率不是很高。您必须首先查询类型,然后查找该类型的表,然后执行第二个查询以获取类型实体。凌乱的
幸运的是,条令2支持类表继承:http://doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html#class-表继承
你会想创建一个基本类型实体,然后从中派生出各个类型(Admin、Manager等)。进行一些配置,你会在用户实体和它的类型之间找到一个很好的一对一关系,每个类型都有自己独特的属性集。