带有鉴别器的 Symfony 3 中的继承
Inheritence in Symfony3 with discriminator
我想在 symfony 中创建这个表描述:
一般作业:
- id(整数)
- 姓名(文字)
- 课程(课程)
- 类型 (1|2)
- 作业(作业 1 如果类型==1|作业 2 如果类型==2)
课程:
- id(整数)
- 姓名(文字)
作业 1:
- id(整数)
- general_assignment(一般作业)
作业 2:
- id(整数)
- general_assignment(一般作业)
所以最好的解决方案是使用这个关系模式:
[简单关系 ManyToOne](课程):Course.id <------> GeneralAssignment.course(GeneralAssignment)
和
[JOINED Ineritence 类型] (GeneralAssignment) : GeneralAssignment.type [1=Assignment1|2=Assignment2]
所以我会得到这个 class 模型(抱歉这张不好的照片):
问题
我以前创建这个模型是因为我想首先创建课程,然后使用课程 ID 创建 GeneralAssignment,最后使用一般作业的 ID 创建特定作业
问题是,我无法使用 Assignment1.general_assignment 在 Assignment1 和 GeneralAssignment 之间创建关系原则关系:"Cannot instantiate abstract class AssignmentGeneral"。 (Assignment2 和 AssignmentGeneral 之间相同)。
我需要 Assignment1.assignment_general 属性,因为我稍后要使用 Assignment1 和 Assignment2 classes,如果我不知道 general_assignment id,我就不能由于从 AssignmentGeneral 继承到特定的 Assignment classes (Assignment1, Assignment2)
,甚至知道作业的一般信息
AssignmentGeneral 是抽象的 class 因为 DiscriminatorMap 要求 class 应该是抽象的。
那我该怎么办?
我无法将 AssignmentGeneral 从 "abstract class" 设置为 "class" 并且我无法在 Assignment1(或 Assignment2)和 Assignment1
中的 GeneralAssignment 之间创建关系
PS : 这些 class 名称不是真实名称,但它们与我的实际问题类似。为了简单起见,我暴露了这个简单的问题。
非常感谢您的每一个回答
此致
[编辑]
我正在添加 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
{
//...
}
Class table inheritance ('JOINED') 不要求父 class 是抽象的。
此外,继承的好处之一是在实例化子对象时获取父对象的属性class。所以你不必实例化两者,只需实例化 Assignment1
或 Assignment2
.
在课程实体和 assignmentType
属性 中添加它们的关系,以便您知道它链接到哪个。
我想在 symfony 中创建这个表描述:
一般作业:
- id(整数)
- 姓名(文字)
- 课程(课程)
- 类型 (1|2)
- 作业(作业 1 如果类型==1|作业 2 如果类型==2)
课程:
- id(整数)
- 姓名(文字)
作业 1:
- id(整数)
- general_assignment(一般作业)
作业 2:
- id(整数)
- general_assignment(一般作业)
所以最好的解决方案是使用这个关系模式:
[简单关系 ManyToOne](课程):Course.id <------> GeneralAssignment.course(GeneralAssignment)
和
[JOINED Ineritence 类型] (GeneralAssignment) : GeneralAssignment.type [1=Assignment1|2=Assignment2]
所以我会得到这个 class 模型(抱歉这张不好的照片):
问题
我以前创建这个模型是因为我想首先创建课程,然后使用课程 ID 创建 GeneralAssignment,最后使用一般作业的 ID 创建特定作业
问题是,我无法使用 Assignment1.general_assignment 在 Assignment1 和 GeneralAssignment 之间创建关系原则关系:"Cannot instantiate abstract class AssignmentGeneral"。 (Assignment2 和 AssignmentGeneral 之间相同)。
我需要 Assignment1.assignment_general 属性,因为我稍后要使用 Assignment1 和 Assignment2 classes,如果我不知道 general_assignment id,我就不能由于从 AssignmentGeneral 继承到特定的 Assignment classes (Assignment1, Assignment2)
,甚至知道作业的一般信息AssignmentGeneral 是抽象的 class 因为 DiscriminatorMap 要求 class 应该是抽象的。
那我该怎么办?
我无法将 AssignmentGeneral 从 "abstract class" 设置为 "class" 并且我无法在 Assignment1(或 Assignment2)和 Assignment1
中的 GeneralAssignment 之间创建关系PS : 这些 class 名称不是真实名称,但它们与我的实际问题类似。为了简单起见,我暴露了这个简单的问题。
非常感谢您的每一个回答
此致
[编辑] 我正在添加 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
{
//...
}
Class table inheritance ('JOINED') 不要求父 class 是抽象的。
此外,继承的好处之一是在实例化子对象时获取父对象的属性class。所以你不必实例化两者,只需实例化 Assignment1
或 Assignment2
.
在课程实体和 assignmentType
属性 中添加它们的关系,以便您知道它链接到哪个。