简而言之:
当我在OneToMany关系中使用'sonata_type_collection'时,我必须指定关系的另一面,它在“创建动作”中仍然不存在,并且可以设置“更新动作”,但它也是可能的指定完全不同的父母。
更详细的解释:
我正在使用Sonata Admin Bundle进行CRUD操作,并假设我只有Post(id,title,content)和Tag(id,post_id,title)实体。 我希望能够在编辑Post实体时添加和删除标记实体,因此我使用'sonata_type_collection'字段。
这是PostAdmin类的configureFormFields方法:
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('title')
->add('content')
->add('tags', 'sonata_type_collection', array(), array(
'edit' => 'inline',
'inline' => 'table'
))
))
;
}
问题是在创建表单中,当我添加新标签时,我必须同时指定帖子和标题,但Post仍然不存在,所以我无法添加标签。 当我正在编辑帖子时,我可以添加新标签,但是对于每一个我都必须明确设置帖子,我可以为不同的帖子添加标签。
你能告诉我如何解决这个问题吗?
答案 0 :(得分:8)
您可能希望将by_reference选项设置为false。
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('title')
->add('content')
->add('tags', \Sonata\CoreBundle\Form\Type\CollectionType::class,
array('by_reference' => false),
array('edit' => 'inline',
'inline' => 'table'
)
);
}
[编辑] 因此看起来问题来自Post实体,它必须调用标签' addTag()方法中的setPost()方法。
public function addTag($tag)
{
$tag->setPost($this);
$this->tags->add($tag);
return $this;
}