我在两个实体之间有多对多的关系。我们打电话给那些User
和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()
没有调用更新操作(读作提交建立在现有实体上的表单)。所以我的代码只在我创建新条目时运行(我仍然没有解决方案)
答案 0 :(得分: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表格案例中:
->add('utenti', 'collection', array(
'type' => new User(),
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'by_reference' => false,
))
;
答案 1 :(得分: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);
}
}
}
答案 2 :(得分:0)
尝试将以下内容添加到管理类
public function prePersist($group)
{
$group->setUsers($group->getUsers());
parent::prePersist($testQuestion);
}
public function preUpdate($group)
{
$group->setUsers($group->getUsers());
parent::preUpdate($testQuestion);
}