学说3路图谱

问题描述 投票:0回答:1

我需要一些帮助,让我的头脑围绕着一个3路映射。

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

也许我们有以下数据。

学生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
}
doctrine-orm symfony4
1个回答
1
投票

这是典型的Many to Many关系与边缘数据关系数据用例。

实际上,你有关系数据类与额外的元数据关于他们的关系,因此它成为一个实体,你访问它就像任何其他实体类。用图、节点和边来思考这个关系。你的学生和父实体是节点,而他们之间的关系是一条边,权重为trueefalse(即01)。

对于RDBMS,你可以通过引入3个实体来解决这个问题。

  1. Student
  2. Parent
  3. ParentStudent 或者... StudentParent 合辙押韵

你可以有尽可能多的数据到这个关系,也可以将它的ID映射到其他相关数据到这个关联,因为它现在是一个实体。

此外,你还拥有相互之间的Following关系,从中间实体的OneToMany和ManyToOne映射的反面,最终通过ManyToMany连接两个实体。ParentStudent 实体:

<?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;
}
© www.soinside.com 2019 - 2024. All rights reserved.