0

次のクラスメンバーとマッピングを持つグループエンティティがあります。

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

子の削除:

???????

どうすれば子供を連れ去ることができますか?

4

3 に答える 3

4

Doctrineがリレーションシップから値のリストを取得するとき、通常の配列ではなくArrayCollectionのインスタンスを使用します。

ArrayCollectionはArrayAccessを実装します。これは、これが問題なく機能することを意味しunsetます。

ただし、それを行う簡単な方法は次のとおりです。

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

しかし、私はあなたの現在の例と少し混乱しています。結合テーブルで子IDとグループIDが同一であると想定しているのはなぜですか?そして、なぜあなたの追加の例であなたは配列に追加$groupしているのですか?$children[]批判的であることを意味するものではありませんが、それはあなたの意図を解析することを困難にします。

于 2010-09-07T20:43:51.123 に答える
0
public function removeChild(Group $group)
{
    foreach ($this->getChildren() as $key => $child)
    {
        if ($child->getId() == $group->getId())
            unset($this->children[$key]);
            break;
    }
}

これは機能します。しかし、それは最も効率的な方法ですか?

于 2010-09-07T02:42:51.667 に答える
0

ArrayCollection::removeElementを使用します

于 2011-12-05T14:17:12.037 に答える