【问题标题】:Doctrine 3 Way Mapping教义 3 路映射
【发布时间】:2020-04-26 13:51:06
【问题描述】:

我需要一些帮助来了解三向映射。

我有一个实体 Student 和一个实体 Parent,显然一个家长可以有很多学生,反之亦然,但我需要每个家长和学生之间的额外信息,每个家长和学生都不同。

也许我们有以下数据:

学生 A - 家长 A(无责任),家长 B(有责任) - 即使一位家长承担法律责任而另一方不承担法律责任,但他们仍然是同一个学生的父母。

学生 B - 家长 A(有责任),家长 B(有责任) - 在这种情况下,另一个学生有相同的父母,但这次他们都有法律责任。

要开始我将拥有的基本实体:

class Student
{
    // normally would have a ManyToMany here to link parents, but i need the 3rd entity
    // to hold whether this student's parent has legal responsibility or not
}

class Parent
{
    // normally again would have ManyToMany here to link students to the parent
}

class ParentStudent
{
    /**
    * @var boolean
    * @ORM\Column(type="boolean", options={"default":true})
    */
    private $responsibility = true;

    // it's this part where i link student to parent and vice versa that's becoming confusing
}

【问题讨论】:

  • 删除父母和学生之间的多对多关系,并将其替换为与 ParentStudent 实体的一对多关系。当您的多对多关系需要附加属性时,这是最直接的方法。
  • @Cerad 你能举个例子吗?很难想象它

标签: doctrine-orm symfony4


【解决方案1】:

这是典型的多对多关系与边缘数据/关系数据用例。

实际上,您拥有关系数据类,其中包含有关其关系的额外元数据,因此它成为一个实体,您可以像访问任何其他实体类一样访问它。从图、节点和边的角度考虑这种关系。您的学生和父实体是节点,而它们之间的关系是权重为真/假(即 0/1)的边。

对于 RDBMS,您可以通过引入 3 个实体来解决它:

  1. Student
  2. Parent
  3. ParentStudentStudentParent 哪个更适合和押韵应用程序

您可以拥有与此关系一样多的数据,并将其 ID 映射到此关联的其他相关数据,因为它现在是一个实体。

您还拥有相互之间的以下关系,从 OneToMany 与中间实体和 ManyToOne 映射反向,最终通过ParentStudent Entity 将两个实体连接为 ManyToMany:

<?php 
/*
* @ORM\Entity()
*/
class Student  {
     /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
     private $id;

     /**
     * @ORM\OneToMany(targetEntity="App\Entity\ParentStudent", mappedBy="student", orphanRemoval=true)
     */
      private $parentStudent;
}

/*
* @ORM\Entity()
*/    
class Parent  {
     /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
     private $id;

     /**
     * @ORM\OneToMany(targetEntity="App\Entity\ParentStudent", mappedBy="parent", orphanRemoval=true)
     */
      private $parentStudent;
}

/*
* @ORM\Entity()
*/
class ParentStudent  {

     /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

     /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Parent", inversedBy="parentStudent")
     * @ORM\JoinColumn(nullable=false)
     */
    private $parent;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Student", inversedBy="parentStudent")
     * @ORM\JoinColumn(nullable=false)
     */
    private $student;

    /**
    * @var boolean
    * @ORM\Column(type="boolean", options={"default":true})
    */
    private $responsibility = true;
}

【讨论】:

    猜你喜欢
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多