就像@Kris 所说的那样——你会选择一对多的中间实体。如果您选择多对多,那么您将没有中间表的类文件,这在大多数情况下是一个问题。
M-N 假设: 一个学生学习多门课程,一门课程可以有许多学生。
以下两个示例都在数据库中为您提供了此 ERD,但您希望选择 ONE to MANY 版本。
多对多:
这将在数据库中创建 StudentCourse 实体,但您看不到实际的类文件供您处理。
class Student
{
protected $id;
protected $name;
/**
* @ORM\ManyToMany(targetEntity="Course")
* @ORM\JoinTable(
* name="StudentCourse",
* joinColumns={@ORM\JoinColumn(name="studentId", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="courseId", referencedColumnName="id")}
* )
*/
private $course;
}
class Course
{
protected $id;
protected $name;
}
一对多:
这将在数据库中创建StudentCourse 实体,如您所见,在编码时有一个实际的类文件供您处理,例如persist() 等。
class Student
{
protected $id;
protected $name;
/**
* @ORM\OneToMany(targetEntity="StudentCourse", mappedBy="studentMap",
* cascade={"persist", "remove"})
*/
protected $studentInverse;
}
class StudentCourse
{
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Course", inversedBy="courseInverse")
* @ORM\JoinColumn(name="course", referencedColumnName="id",
* nullable=false, onDelete="CASCADE")
*/
protected $courseMap;
/**
* @ORM\ManyToOne(targetEntity="Student", inversedBy="studentInverse")
* @ORM\JoinColumn(name="student", referencedColumnName="id",
* nullable=false, onDelete="CASCADE")
*/
protected $studentMap;
}
class Course
{
protected $id;
protected $name;
/**
* @ORM\OneToMany(targetEntity="StudentCourse", mappedBy="courseMap",
* cascade={"persist", "remove"})
*/
protected $courseInverse;
}
编辑:
onDelete="CASCADE" 和 cascade={"persist", "remove"} 位不是强制性的。他们处理数据冗余。 Is it bad to use redundant relationships?