带鉴别器的Symfony3中的遗传
我想在symfony中创建此表说明: 一般指示:带鉴别器的Symfony3中的遗传,symfony,inheritance,doctrine,discriminator,symfony3.x,Symfony,Inheritance,Doctrine,Discriminator,Symfony3.x,我想在symfony中创建此表说明: 一般指示: id(int) 名称(文本) 课程(课程) 类型(1 | 2) 赋值(如果类型==1,则赋值1;如果类型==2,则赋值2) 课程: id(int) 名称(文本) 转让1: id(int) 一般指派(一般指派) 转让2: id(int) 一般指派(一般指派) 因此,最好的解决方案是使用此关系模式: [简单关系ManyToOne](课程):Course.id generalsignment.Course(generalsignment
- id(int)
- 名称(文本)
- 课程(课程)
- 类型(1 | 2)
- 赋值(如果类型==1,则赋值1;如果类型==2,则赋值2)
- id(int)
- 名称(文本)
- id(int)
- 一般指派(一般指派)
- id(int)
- 一般指派(一般指派)
/**
*
* @ORM\Table(name="assignment_general")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="integer")
* @ORM\MappedSuperclass
* @ORM\DiscriminatorMap({
1 = "Assignment1",
* 2 = "Assignment2"
* })
*/
abstract class StatisticsGeneralAbstract
{
//...
}
而且:
/**
*
* @ORM\Table(name="assignment1")
*
*/
class Assignment1 extends AssignmentGeneral
{
//...
}
/**
*
* @ORM\Table(name="assignment2")
*
*/
class Assignment2 extends AssignmentGeneral
{
//...
}
不要求父类是抽象的
此外,继承的好处之一是在实例化子类时获取父类的属性。因此您不必同时实例化这两个,只需实例化Assignment1
或Assignment2
在课程实体和
assignmentType
属性中为这两个属性添加关系,以便您知道它链接到哪一个。因为如果我删除“摘要”,我会得到此错误“'AssignmentGeneral'必须是'AssignmentGeneral'的鉴别器映射的一部分”。我只需要DiscriminatorMap()中的Assignment1和Assignment2类,而不需要AssignmentGeneral类。最后,我需要使用提供有关AssignmentX和AssignmentGeneral类信息的类。[抱歉,我错误地删除了我的注释]是的,这是因为所有类都必须在鉴别器映射中,这就是单表继承的工作方式。没问题,我使用了联接继承。但你所说的也适用于联合继承。我添加了任务一般声明。好的。让AssignmentGeneral成为映射超类的原因是什么?您还需要帮助吗?如果没有,请将答案标记为已接受。抱歉,回答晚了。我发现我需要再次阅读有关继承的文档。在阅读了你的答案后,我尝试了很多解决方案,但我没有得到我需要的答案。也许你的答案帮助我更正了代码,这就是为什么我将你的答案标记为解决方案。我发现子类和父类具有相同的id。因此,我不需要额外的属性来从子类获取父类。这很令人失望,因为我想创建一个关系manytone(多个赋值和一个赋值general)。但是我不能这样做。但是,你能告诉我,即使忽略继承,我应该怎么做来创建这样的关系吗?顺便说一下,如果有一个使用InGenetince的解决方案,我不应该将赋值数据(childs)和AssignmentGeneral(parent)数据放在同一个表中,这就是为什么一开始我选择了联合继承类型。但是,当我要持久化AssignmentGeneral对象时,它会使用相同的id自动持久化Assignment对象。即使我可以通过持久化一个新的Assignment对象来欺骗它,而不持久化AssignmentGeneral对象,我也无法将持久化的Assignment对象链接到非持久化的AssignmentGeneral对象