我的Symfony应用程序中有文章实体和标记实体。我有一个嵌套的表单来编辑和标记文章:
当我从此表单添加新标记时,Doctrine会尝试在Tag
表中插入新标记,而不是在连接表中插入新关系,即article_tag
,这会产生唯一的名称约束违规。为了解决这个问题,我创建了一个data transformer,它可以获取并返回任何现有的Tag
对象:
public function reverseTransform($name)
{
//…
return $this->om
->getRepository('AcmeBundle:Tag')
->findOneByName($name)
;
}
不幸的是,应用程序将其转换回字符串(DBAL / Statement.php第103行),因此Doctrine仍会启动相同的插入查询。我怎么能阻止这个?我应该在哪里寻找任何错误?
在我关于reusing existing entities的问题中检查 ArticleType.php 和 TagType.php ,查看我的表单类型文件和我关于avoiding duplicate entries with Doctrine关于协会的问题中的两个实体!我需要保留新标签(它可以工作),并为新关系选择已经存在的标签。很长一段时间以来,我一直在努力完成这项任务。
答案 0 :(得分:0)
您可以将标记设置为不在ArticleType
:
$builder->add('tags', 'text', array(
//...
'mapped' => false
));
然后,您可以获得控制器中标签的值,您可以找到它的现有实体。然后,您可以将这些代码设置为Article
:
$data = $form->getData();
// now $data['tags'] are the tags
// ... Get the tags entities by Doctrine and set them to the article
$article->addTag($tag);
(当然,您必须在addTag()
中实施Article.php
方法。)
您只需persist()
然后flush()
,即可正确保存关系。
答案 1 :(得分:0)
在ArticleType.php中尝试此操作:
$builder->add('tags', new TagType(), array(
//...
'by_reference' => false,
));
为您添加标记自动填充功能,请检查此捆绑包https://github.com/PUGX/PUGXAutoCompleterBundle