学说 - Symfony2 |多对多人瞄准同一个实体

时间:2014-06-25 08:24:04

标签: php symfony doctrine-orm

我正在尝试创建一个针对同一实体的多对多外键表关系。

我已成功创建与其他实体的关系,但在定位同一实体时遇到了麻烦。

我读了一些堆栈溢出问题和答案,看到我正在做的事情是可能的.. I based my class of this example - 当我添加父级时,表unit_relations为空,但在将子项添加到单元时起作用。我假设因为该字段具有inversedBy注释。

我需要添加什么才能进行双向更新/插入?

I tried swapping the joinColums like this answer - 没什么......

-

 /**
 * Unit
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Acme\DemoBundle\Entity\UnitRepository")
 */
class Unit
{
   ....

   /**
     * @ORM\ManyToMany(targetEntity="Unit",  inversedBy="parents")
     * @ORM\JoinTable(name="unit_relations",
     *     joinColumns={@ORM\JoinColumn(name="unit_id", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="child_unit_id", referencedColumnName="id")}
     * )
     */
    private $children;

    /**
     * @ORM\ManyToMany(targetEntity="Unit",  mappedBy="children")
     */
    private $parents;
}

正在添加inversedBy而不是mappedBy,而且还会交换连接列,这是正确的方法吗?

有人可以解释一下吗?

/**
     * @ORM\ManyToMany(targetEntity="Unit",  inversedBy="parents")
     * @ORM\JoinTable(name="unit_relations",
     *     joinColumns={@ORM\JoinColumn(name="unit_id", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="child_unit_id", referencedColumnName="id")}
     * )
     */
    private $children;

    /**
     * @ORM\ManyToMany(targetEntity="Unit",  inversedBy="children")
     * @ORM\JoinTable(name="unit_relations",
     *     joinColumns={@ORM\JoinColumn(name="child_unit_id", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="unit_id", referencedColumnName="id")}
     * )
     */
    private $parents;

修改

这里要求的是显示我如何创建关系的代码。我刚才意识到这可能是因为实体没有id,因为我在创建时添加了关系...

$unit = new \Acme\DemoBundle\Entity\Unit();
/* @var $parentUnit \Acme\DemoBundle\Entity\Unit */
$parentUnit = $this->getDoctrine()->getRepository('AcmeDemoBundle:Unit')->findById($request->get('unitId'));
$unit->addParent($parentUnit);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($unit);
$entityManager->flush();

1 个答案:

答案 0 :(得分:1)

添加父关系时没有ID并不重要。

我不能详细解释为什么会发生这种情况,但我认为主要的问题是,在多对多自我引用中,使用JoinTable注释的属性可能是主实体。你可以说,它拥有"与该实体的所有其他关系。

您可以在更改功能$unit->addParent($parent)时接收双向更新/插入。改变如下:

  public function addParent($parent)
  {
      $this->parents[] = $parent;
      $parent->addChild($this); // Add the relation in the proper way
  }

这应该可以正常工作!

问候!