具有鉴别器的

时间:2018-04-28 18:08:43

标签: symfony inheritance doctrine discriminator symfony3.x

我想在symfony中创建这个表格描述:

GeneralAssignment:

  • id(int)
  • 姓名(文字)
  • 课程(课程)
  • type(1 | 2)
  • 赋值(Assignment1 if type == 1 | Assignment2 if type == 2)

课程:

  • id(int)
  • 姓名(文字)

分配1:

  • id(int)
  • general_assignment(GeneralAssignment)

Assignment2:

  • id(int)
  • general_assignment(GeneralAssignment)

所以最好的解决方案是使用这种关系模式:

[简单关系ManyToOne](课程):Course.id< ------> GeneralAssignment.course(GeneralAssignment)

[JOINED Ineritence type](GeneralAssignment):GeneralAssignment.type [1 = Assignment1 | 2 = Assignment2]

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

class model

问题

我曾经创建过这个模型,因为我想首先创建课程,然后使用课程ID创建GeneralAssignment,最后使用常规作业的id创建特定作业

问题是,我无法使用Assignment1.general_assignment在Assignment1和GeneralAssignment之间创建关系学说关系:“无法实例化抽象类AssignmentGeneral”。 (Assignment2和AssignmentGeneral之间的情况相同)。

我需要Assignment1.assignment_general属性,因为我稍后会使用Assignment1和Assignment2类,如果我不知道general_assignment id,我甚至不知道赋值一般信息,因为从AssignmentGeneral继承到特定的分配类(Assignment1,Assignment2)

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

那我该怎么办?

我无法将AssignmentGeneral从“abstract class”设置为“class”,我无法在Assignment1中的Assignment1(或Assignment2)和GeneralAssignment之间创建关系

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

非常感谢您的每一个答案

祝你好运

[编辑] 我正在添加AssignmentGeneral声明

/**
 *
 * @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
{
//...
}

1 个答案:

答案 0 :(得分:1)

Class table inheritance ('JOINED')并不要求父类是抽象的。

此外,继承的一个好处是在实例化子类时获取父属性。因此,您不必实例化这两者,只需实例化Assignment1Assignment2

在“课程”实体和assignmentType属性中为它们添加关系,以便您知道它与哪个属性相关联。