Doctrine2 rimuovere rapporto ManyToMany
-
01-10-2019 - |
Domanda
Ho un Entità di gruppo con il seguente membro della classe e mappatura:
/**
* @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;
L'aggiunta di un bambino è banale:
public function addChild(Group $group)
{
if (! $this->hasChild($group)) {
$this->children[] = $group;
App::getEntityManager()->persist($this);
}
}
La rimozione di un bambino:
???????
Come faccio a rimuovere un bambino?
Soluzione
Quando Dottrina recupera un elenco di valori da un rapporto, utilizza un'istanza di ArrayCollection al contrario di una serie regolare.
ArrayCollection attrezzi ArrayAccess, il che significa che unset
funziona bene.
Tuttavia, un modo più semplice di farlo potrebbe essere:
$this->getChildren()->removeElement($child) // to remove by object
$this->getChildren()->remove($index) // to remove by array index
Anche se, io sono un po 'confuso con il vostro esempio attuale. Perché si stanno assumendo che l'ID del bambino e del gruppo dovrebbero essere identiche nella tabella aderire? E perché nel tuo esempio aggiungendo stai aggiungendo $group
alla matrice $children[]
? Non voglio dire di essere critici, ma rende l'analisi vostra intenzione difficile.
Altri suggerimenti
public function removeChild(Group $group)
{
foreach ($this->getChildren() as $key => $child)
{
if ($child->getId() == $group->getId())
unset($this->children[$key]);
break;
}
}
Questo funziona. E 'il modo più efficiente, anche se?
Usa ArrayCollection :: removeElement