我需要一些帮助来了解3向映射。
我有一个实体学生和一个实体家长,显然一个家长可以有很多学生,反之亦然,但我需要每个家长和学生之间的额外信息,每个信息都不同。
也许我们有以下数据:
学生A——父母A(无责任(,父母B(有责任(——即使父母一方承担法律责任,另一方不承担,他们仍然是同一学生的父母。
学生B——父母A(有责任(,父母B(有责任"——在这种情况下,另一名学生有相同的父母,但这次他们都有法律责任。
要启动基本实体,我会有:
class Student
{
// normally would have a ManyToMany here to link parents, but i need the 3rd entity
// to hold whether this student's parent has legal responsibility or not
}
class Parent
{
// normally again would have ManyToMany here to link students to the parent
}
class ParentStudent
{
/**
* @var boolean
* @ORMColumn(type="boolean", options={"default":true})
*/
private $responsibility = true;
// it's this part where i link student to parent and vice versa that's becoming confusing
}
这是典型的带有边缘数据的多对多关系/关系数据用例。
实际上,你有一个关系数据类,它包含了关于它们关系的额外元数据,因此它变成了一个实体,你可以像访问任何其他实体类一样访问它。从图、节点和边的角度来思考这种关系。您的学生和家长实体是节点,而它们之间的关系是权重为true/false(即0/1(的边。
对于RDBMS,您可以通过引入3个实体来解决它:
Student
Parent
ParentStudent
或StudentParent
,以适合应用且押韵较好者为准
您可以为该关系提供尽可能多的数据,还可以将其ID映射到该关联的其他相关数据,因为它现在是一个实体。
此外,您彼此之间有以下关系,从具有中间实体的OneToMany到映射反向的ManyToOne,最终通过ParentStudent
实体将两个实体连接为ManyToMany:
<?php
/*
* @ORMEntity()
*/
class Student {
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMOneToMany(targetEntity="AppEntityParentStudent", mappedBy="student", orphanRemoval=true)
*/
private $parentStudent;
}
/*
* @ORMEntity()
*/
class Parent {
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMOneToMany(targetEntity="AppEntityParentStudent", mappedBy="parent", orphanRemoval=true)
*/
private $parentStudent;
}
/*
* @ORMEntity()
*/
class ParentStudent {
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMManyToOne(targetEntity="AppEntityParent", inversedBy="parentStudent")
* @ORMJoinColumn(nullable=false)
*/
private $parent;
/**
* @ORMManyToOne(targetEntity="AppEntityStudent", inversedBy="parentStudent")
* @ORMJoinColumn(nullable=false)
*/
private $student;
/**
* @var boolean
* @ORMColumn(type="boolean", options={"default":true})
*/
private $responsibility = true;
}