多对多,一对多或多对一

Ale*_*igh 2 orm entities symfony doctrine-orm

我试图弄清“教义2” ORM关系,我以为我掌握了它,但是在阅读了一些Symfony食谱后,我怀疑我实际上有些困惑。

我目前有一个系统,其中一个模板可以包含多个模块(包括每个类型的多个模块),并且多个模板可以使用同一模块。

我认为这可以保证实现ManyToMany关系,并且确实在我的餐桌上看,它似乎工作得很好。

但是,我在编写数据库查询时意识到,我需要按一定顺序加载模块,这意味着我的联接表需要具有第三个“ order_by”列。我读过一个真正的联接表只有两列。

因此造成混乱。我应该在实体中设置什么?

Ben*_*der 6

就像@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"}位不是强制性的。他们处理数据冗余。使用冗余关系不好吗?