[英]Doctrine - Symfony2 | Many to Many targeting the same entity
我正在嘗試創建針對同一實體的多對多外鍵表關系。
我已經成功創建了與其他實體的關系,但是在定位同一實體時遇到了麻煩。
我讀了幾堆棧溢出的問題和答案,看到我在做什么是可能的.. 我根據我的課這個例子 -表unit_relations
是空的,當我添加父,但是當我添加一個孩子一個單位工作。 我假設是因為該字段具有inversedBy
注釋。
我需要添加什么以允許雙向更新/插入?
我試圖像這樣的答案交換joinColums-什么都沒有...
-
/**
* 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
,並且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();
添加父關系時沒有ID沒關系。
我無法詳細解釋為什么會發生這種情況,但是我認為主要的問題是,在多對多自引用中,具有JoinTable批注的屬性可能是主實體。 您可以說,它“保留”了與該實體的所有其他關系。
您可以在更改函數$unit->addParent($parent)
接收雙向更新/插入。 進行如下更改:
public function addParent($parent)
{
$this->parents[] = $parent;
$parent->addChild($this); // Add the relation in the proper way
}
那應該很好!
問候!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.