首页 > 解决方案 > 同一类型实体上的 Symfony 多对多关系

问题描述

我正在尝试解决我所说的“兄弟姐妹困境”:我有一个可以有兄弟姐妹的实体人,当然这也是人。

因此,我创建了以下实体:

/**
 * Person
 *
 * @ORM\Table(name="person")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\PersonRepository")
 */
class Person {

    /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Person", inversedBy="ref_siblings")
     * @ORM\JoinTable(name="siblings",  
     *  joinColumns={ @ORM\JoinColumn(name="person", referencedColumnName="id") },
     *  inverseJoinColumns={ @ORM\JoinColumn(name="sibling", referencedColumnName="id") }
     * )
     */
     private $siblings;

    /**
     * @param Person $person
     */
    public function addSibling(Person $person)
    {
        if ($this->siblings->contains($person)) {
            return;
        }

        $this->siblings->add($person);
        $person->addSibling($this);
    }

    /**
     * @param Person $person
     */
    public function removeSibling(Person $person)
    {
        if (!$this->siblings->contains($person)) {
            return;
        }

        $this->siblings->removeElement($person);
        $person->removeSibling($this);
    }
    ...
}

因此,通过向一个人添加兄弟姐妹,我可以成功地将关系存储在学说创建的关系表中:

mysql> select * from siblings;
+--------+---------+
| person | sibling |
+--------+---------+
|   681  |     715 |
+--------+---------+

到目前为止,一切都很好。

但是,它并没有满足我的要求。当前的解决方案显示了人 681 的兄弟姐妹,但不是人 715。我需要有一些东西来存储反面的关系,因为人 715 也有兄弟姐妹 - 即人 681。

有没有一种方便的方法来存储这样的关系:

mysql> select * from siblings;
+--------+---------+
| person | sibling |
+--------+---------+
|   681  |     715 |
|   715  |     681 |
+--------+---------+

我发现的唯一解决方法是在 PersonController 类中执行以下操作:

  foreach($person->getSiblings() as $sibling) {
      $sibling->addSibling($person);
      $em->persist($sibling);
  }
  $em->flush();

但是,如果我尝试删除兄弟姐妹,这并不能解决问题。

标签: symfonydoctrinemany-to-many

解决方案


推荐阅读