1

我有两个实体之间的多对多关系。让我们称之为 UserAnd 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 调用你想要更新的对象的 setter。

对于该用途:

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 回答