doctrine2 удалить отношения ManyToMany - PullRequest
0 голосов
/ 07 сентября 2010

У меня есть объект группы со следующим членом класса и сопоставлением:

/**
 * @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);
    }
}

Удаление ребенка:

???????

Как бы я убрал ребенка?

Ответы [ 3 ]

4 голосов
/ 08 сентября 2010

Когда Doctrine получает список значений из отношения, он использует экземпляр ArrayCollection , а не обычный массив.

ArrayCollection реализует ArrayAccess, что означает, что unset работаетпросто отлично.

Однако, более простой способ сделать это будет:

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

Хотя я немного запутался в вашем текущем примере.Почему вы предполагаете, что идентификатор ребенка и идентификатор группы должны быть идентичны в таблице соединений?И почему в вашем примере добавления вы добавляете $group в массив $children[]?Не хочу быть критичным, но это затрудняет анализ вашего намерения.

0 голосов
/ 05 декабря 2011

Использовать ArrayCollection :: removeElement

0 голосов
/ 07 сентября 2010
public function removeChild(Group $group)
{
    foreach ($this->getChildren() as $key => $child)
    {
        if ($child->getId() == $group->getId())
            unset($this->children[$key]);
            break;
    }
}

Это работает.Это самый эффективный способ?

...