Doctrine orm 第三条道路地图

Doctrine orm 第三条道路地图,doctrine-orm,symfony4,Doctrine Orm,Symfony4,我需要一些帮助,让我的头脑了解三向映射 我有一个实体学生和一个实体家长,很明显,一个家长可以有很多学生,反之亦然,但我需要每个家长和学生之间的额外信息,这些信息对于每个人都是不同的 也许我们有以下数据: 学生A-父母A(无责任),父母B(有责任)-即使父母一方承担法律责任,另一方不承担法律责任,他们仍然是同一学生的父母 学生B-家长A(有责任),家长B(有责任)-在这种情况下,另一个学生有相同的家长,但这次他们都有法律责任 要启动基本实体,我需要: class Student { //

我需要一些帮助,让我的头脑了解三向映射

我有一个实体学生和一个实体家长,很明显,一个家长可以有很多学生,反之亦然,但我需要每个家长和学生之间的额外信息,这些信息对于每个人都是不同的

也许我们有以下数据:

学生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
}

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

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

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

  • 学生
  • Parent
  • ParentStudent
    StudentParent
    无论哪一个更适合并与申请押韵
  • 您可以将尽可能多的数据映射到此关系,还可以将其ID映射到该关联的其他相关数据,因为它现在是一个实体

    此外,您彼此之间存在以下关系,从中间实体的一个多实体到多个映射的反向,最终通过
    ParentStudent
    entity将两个实体连接为多个多实体:

    <?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;
    }
    

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