Doctrine2 Entfernen ManyToMany Beziehung
-
01-10-2019 - |
Frage
Ich habe eine Konzerngesellschaft mit dem folgende Klassenmitglied und Zuordnung:
/**
* @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;
ein Kind hinzuzufügen ist trivial:
public function addChild(Group $group)
{
if (! $this->hasChild($group)) {
$this->children[] = $group;
App::getEntityManager()->persist($this);
}
}
ein Kind entfernen:
???????
Wie würde ich ein Kind entfernen?
Lösung
Wenn Lehre eine Liste von Werten aus einer Beziehung abruft, verwendet es eine Instanz von Arraycollection als zu einer regelmäßigen Anordnung gegenüber.
Arraycollection implementiert Arrayaccess, was bedeutet, dass unset
funktioniert gut.
Allerdings ist eine einfachere Art und Weise, es zu tun wäre:
$this->getChildren()->removeElement($child) // to remove by object
$this->getChildren()->remove($index) // to remove by array index
Obwohl, ich bin ein wenig verwirrt mit Ihrem aktuellen Beispiel. Warum gehen davon aus, dass das Kind und Gruppen-ID sollte in der Join-Tabelle identisch sein? Und warum in Ihrem Zugabe Beispiel hinzufügen Sie $group
zum $children[]
Array? bedeutet nicht kritisch sein, aber es macht Ihre Absicht schwierig Parsen.
Andere Tipps
public function removeChild(Group $group)
{
foreach ($this->getChildren() as $key => $child)
{
if ($child->getId() == $group->getId())
unset($this->children[$key]);
break;
}
}
Das funktioniert. Ist es der effizienteste Weg, wenn?
Verwenden Arraycollection :: removeElement