首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多对多,一对多,多对一

多对多,一对多,多对一
EN

Stack Overflow用户
提问于 2014-10-25 18:34:15
回答 2查看 4K关注 0票数 2

我试图让我的头脑对原则2 ORM的关系,我以为我有它的诀窍,但在阅读了几个symfony食谱条目,我怀疑我实际上有点困惑。

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

我认为这将需要一个ManyToMany关系,事实上,看看我的桌子,它似乎工作得很好。

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

因此产生了混乱。我应该在我的实体中设置什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-26 09:51:47

就像克里斯说的--你会向中间实体一分为二。如果您选择多到多,那么您将没有中间表的类文件,这在大多数情况下都是一个问题。

假设:一名学生在多门课程中学习,一门课程可以有多名学生.

下面的两个例子都给出了数据库中的ERD,但是您希望使用一个到多个版本。

多对多:

这将在数据库中创建StudentCourse实体,但如您所见,没有实际的类文件供您处理。

代码语言:javascript
复制
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实体,正如您所看到的,在编写代码时有一个实际的类文件需要处理,例如,持久化()等等。

代码语言:javascript
复制
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?

票数 6
EN

Stack Overflow用户

发布于 2014-10-25 19:00:05

您将需要一个OneToMany/ManyToOne,如果您不需要保存订单,那么它将是一个多个单元,但是由于您需要,这个中间表现在必须是它自己的实体。因此,您需要以下实体

模板

使用OneToMany到

TemplateModules (可能是这个名字更好的名字)

使用ManyToOne到

模块

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26565822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档