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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top