Ale*_*igh 2 orm entities symfony doctrine-orm
我试图弄清“教义2” ORM关系,我以为我掌握了它,但是在阅读了一些Symfony食谱后,我怀疑我实际上有些困惑。
我目前有一个系统,其中一个模板可以包含多个模块(包括每个类型的多个模块),并且多个模板可以使用同一模块。
我认为这可以保证实现ManyToMany关系,并且确实在我的餐桌上看,它似乎工作得很好。
但是,我在编写数据库查询时意识到,我需要按一定顺序加载模块,这意味着我的联接表需要具有第三个“ order_by”列。我读过一个真正的联接表只有两列。
因此造成混乱。我应该在实体中设置什么?
就像@Kris所说的-您将朝着中间实体一对多。如果您选择了“多对多”,那么您将没有中间表的类文件,这在大多数情况下是一个问题。
MN假设:一个学生可以学习许多课程,而一个课程可以有很多学生。
下面的两个示例都在数据库中提供了此ERD,但您想使用ONE到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;
}
Run Code Online (Sandbox Code Playgroud)
一对多:
这将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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
onDelete="CASCADE"和cascade={"persist", "remove"}位不是强制性的。他们处理数据冗余。使用冗余关系不好吗?
| 归档时间: |
|
| 查看次数: |
3083 次 |
| 最近记录: |