Doctrine 3 Way Mapping - PullRequest
       11

Doctrine 3 Way Mapping

0 голосов
/ 26 апреля 2020

Мне нужна помощь, чтобы разобраться в 3-х стороннем картировании.

У меня есть ученик и родитель сущности, очевидно, что у одного родителя может быть много учеников, и наоборот, но мне нужна дополнительная информация между каждым родитель и ученик, которые будут отличаться для каждого из них.

Возможно, у нас есть следующие данные:

Ученик A - Родитель A (без ответственности), Родитель B (несет ответственность) - даже если один родитель несет юридическую ответственность, а другой нет, оба они все еще являются родителями одного и того же учащегося.

Ученик B - Родитель A (несет ответственность), Родитель B (несет ответственность) - в этом случае другой ученик имеет одни и те же родители, но на этот раз они оба несут юридическую ответственность.

Чтобы начать с базовых c сущностей, у меня будет:

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
}

1 Ответ

1 голос
/ 26 апреля 2020

Это типичный пример отношения «многие ко многим» с данными о границах / данными отношений.

У вас фактически есть класс данных отношений с дополнительными метаданными об их отношениях, поэтому он становится сущностью, и вы получаете к ней доступ, как любой другой класс сущностей. Подумайте об этом отношении с точки зрения графа, узлов и ребер. Ваши Учащиеся и Родители являются узлами, в то время как отношения между ними являются ребром с весом true / false (т. Е. 0/1).

Для СУБД вы решаете это путем введения 3 сущностей:

  1. Student
  2. Parent
  3. ParentStudent или StudentParent, в зависимости от того, что лучше подходит и рифмуется с приложением

Вы можете иметь как можно больше данных к этому отношению, а также сопоставить его идентификатор с другими соответствующими данными для этой ассоциации, поскольку теперь она является сущностью.

Далее. У вас есть отношения Follow между собой, которые исходят от 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;
}
...