2010-09-07 142 views
0

我有一個集團與下面的類成員和映射:doctrine2刪除多對多關係

/** 
* @ManyToMany(targetEntity="Group", cascade={"persist"}) 
* @JoinTable(name="groups_children", 
*  joinColumns={@JoinColumn(name="group_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@JoinColumn(name="child_id", referencedColumnName="id", unique=true)} 
*  ) 
*/ 
private $children; 

添加子很簡單:

public function addChild(Group $group) 
{ 
    if (! $this->hasChild($group)) { 
     $this->children[] = $group; 
     App::getEntityManager()->persist($this); 
    } 
} 

刪除子:

??????? 

我會如何移除一個孩子?

回答

4

當Doctrine從關係中檢索值列表時,它使用的是ArrayCollection的實例,而不是常規數組。

ArrayCollection實現ArrayAccess,這意味着unset工作得很好。

然而,這樣做將是一個更簡單的方法:

$this->getChildren()->removeElement($child) // to remove by object 
    $this->getChildren()->remove($index) // to remove by array index 

雖然,我與你當前的例子有點困惑。你爲什麼假設連接表中的Child ID和Group ID應該是相同的?爲什麼在添加示例中,您將$group添加到$children[]陣列?不要意味着批評,但它會使你的意圖難以解析。

0
public function removeChild(Group $group) 
{ 
    foreach ($this->getChildren() as $key => $child) 
    { 
     if ($child->getId() == $group->getId()) 
      unset($this->children[$key]); 
      break; 
    } 
} 

This works。它是最有效的方式嗎?

0

使用ArrayCollection :: removeElement