1

2 つのエンティティ間に多対多の関係があります。UserそれらをAndと呼びましょう Group

作成/更新インターフェイスでは、それらを関連付けることができるため、グループ フォームからユーザーを、またはユーザー フォームからグループを直接関連付けることができると判断しました。リレーションの所有側がUser

今問題が来ます。ユーザーフォームインターフェイスからグループを関連付けると、すべてがうまくいき、完全に機能します(教義は所有側への変更を探します)。Userグループ フォーム インターフェイスから関連付けようとしても、何も機能しません。

明らかに、ユーザーをグループオブジェクトに「追加」し、フォームから渡したすべてのユーザーオブジェクトにグループ (this) を追加する必要があることを完全に知っています。Group実際、これはエンティティへのコードのスニペットです

public function setUsers(\Doctrine\Common\Collections\ArrayCollection $utente)
{
    /* snippet of code for removing old association , didn't reported */

    foreach($utente as $u){
        $this->users[] = $u;
        $u->addGroups($this);
    }
}

このスニペットから作成するまで、彼の仕事はうまくいきます。アップデートしても、そうではありません。
ですから、これはソナタの問題か、現時点では見逃していたものに違いないと思います。

何かアドバイス?

アップデート

ここで何が起こっているのかを理解するのにしばらく時間を費やした後、更新操作に呼び出されていないことがわかりましたsetUser()(既存のエンティティに基づいて構築されたフォームを送信すると読みます)。したがって、新しいエントリを作成したときにのみコードが実行されます (まだ解決策がありません)。

4

3 に答える 3

2

エンティティを更新する方法を見つけました。
これは Symfony2 関連の動作であり、Sonata Admin の動作ではないと思います。

簡単に言えば、更新したいオブジェクトのセッターを呼び出すように Symfony2 に指示する必要があります。

その使用のために:

by_reference => false

Sonata Admin Bundle の場合:

$formMapper
            ->add('nome')
            ->add('canali', 'sonata_type_model', array('required' => false))
            ->add('utenti', 'sonata_type_model', array('required' => false,
                                                       'by_reference' => false))
        ;

純粋な Symfony2 Form の場合:

->add('utenti', 'collection', array(
                'type' => new User(),
                'allow_add' => true,
                'allow_delete' => true,
                'prototype' => true,
                'by_reference' => false,
            ))
        ;
于 2012-09-11T10:50:03.633 に答える
0

更新の場合、うまく機能しないという意味が不明です。あなたのコードに基づいて、ユーザーとグループの間に新しい関係を追加すると思いますが、古いものは削除しません。

public function setUsers(\Doctrine\Common\Collections\ArrayCollection $utente)
{
    // to synch internal and external collections, remove relation between users and groups if user is not in the new collection
    foreach ($this->users as $u) {
        if (!$utente->contains($u)) {
            // add this function to user object, it's trivial, just remove give group from internal groups collection
            $u->removeGroup($this); 
        }
    }
    foreach ($utente as $u) {
        if (!$this->users->contains($u)) {
            $this->users[] = $u;
            $u->addGroups($this);
        }
    }
}
于 2012-09-11T06:23:33.343 に答える
0

以下を管理者クラスに追加してみてください

public function prePersist($group)
{
    $group->setUsers($group->getUsers());
    parent::prePersist($testQuestion);
}

public function preUpdate($group)
{
    $group->setUsers($group->getUsers());
    parent::preUpdate($testQuestion);
}
于 2014-01-30T11:54:00.657 に答える