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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top