我试图让我的头脑对原则2 ORM的关系,我以为我有它的诀窍,但在阅读了几个symfony食谱条目,我怀疑我实际上有点困惑。
我目前有一个系统,其中一个模板可以包含多个模块(包括每种类型中的多个),多个模板可以使用相同的模块。
我认为这将需要一个ManyToMany关系,事实上,看看我的桌子,它似乎工作得很好。
然而,在编写数据库查询时,我意识到我需要按一定的顺序加载模块,这意味着我的联接表需要有第三个'order_by‘列。我读过真正的联接表只有两列。
因此产生了混乱。我应该在我的实体中设置什么呢?
发布于 2014-10-26 09:51:47
就像克里斯说的--你会向中间实体一分为二。如果您选择多到多,那么您将没有中间表的类文件,这在大多数情况下都是一个问题。
假设:一名学生在多门课程中学习,一门课程可以有多名学生.
下面的两个例子都给出了数据库中的ERD,但是您希望使用一个到多个版本。

多对多::
这将在数据库中创建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;
}ONE TO MANY:
这将在数据库中创建StudentCourse实体,正如您所看到的,在编写代码时有一个实际的类文件需要处理,例如,持久化()等等。
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?
发布于 2014-10-25 19:00:05
您将需要一个OneToMany/ManyToOne,如果您不需要保存订单,那么它将是一个多个单元,但是由于您需要,这个中间表现在必须是它自己的实体。因此,您需要以下实体
模板
使用OneToMany到
TemplateModules (可能是这个名字更好的名字)
使用ManyToOne到
模块
https://stackoverflow.com/questions/26565822
复制相似问题