Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带鉴别器的Symfony3中的遗传_Symfony_Inheritance_Doctrine_Discriminator_Symfony3.x - Fatal编程技术网

带鉴别器的Symfony3中的遗传

带鉴别器的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

我想在symfony中创建此表说明:

一般指示:

  • id(int)
  • 名称(文本)
  • 课程(课程)
  • 类型(1 | 2)
  • 赋值(如果类型==1,则赋值1;如果类型==2,则赋值2)
课程:

  • id(int)
  • 名称(文本)
转让1:

  • id(int)
  • 一般指派(一般指派)
转让2:

  • id(int)
  • 一般指派(一般指派)
因此,最好的解决方案是使用此关系模式:

[简单关系ManyToOne](课程):Course.id generalsignment.Course(generalsignment)

[合并惯性类型](GeneralAssignment):GeneralAssignment.type[1=Assignment1 | 2=Assignment2]

所以我将得到这个班级模型(很抱歉这张糟糕的照片):

问题

我之所以创建这个模型,是因为我想首先创建课程,然后使用课程id创建一般分配,最后使用一般分配的id创建特定分配

问题是,我无法使用Assignment1.general\u赋值在Assignment1和generalsignment之间创建关系原则关系:“无法实例化抽象类AssignmentGeneral”。(转让2和转让一般之间的情况相同)

我需要Assignment1.assignment\u general属性,因为我稍后将使用Assignment1和Assignment2类,如果我不知道general\u赋值id,我甚至不知道赋值general信息,因为从AssignmentGeneral继承到特定赋值类(Assignment1,Assignment2)

AssignmentGeneral是一个抽象类,因为DiscriminatorMap要求该类应该是抽象的

那我该怎么办呢

我不能将AssignmentGeneral从“抽象类”设置为“类”,也不能在Assignment1(或Assignment2)和Assignment1中的GeneralAssignment之间创建关系

PS:这些类名不是真实的,但它们与我真正的问题相似。为了简单起见,我暴露了这个简单的问题

非常感谢您的回答

致意

[编辑] 我在添加任务总声明

/**
 *
 * @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对象