如何通过与Symfony的关系更新实体?

时间:2014-06-26 20:28:04

标签: php symfony doctrine-orm

我的Symfony应用程序中有文章实体和标记实体。我有一个嵌套的表单来编辑和标记文章:

I can add tags from inside the article form.

当我从此表单添加新标记时,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关于协会的问题中的两个实体!我需要保留新标签(它可以工作),并为新关系选择已经存在的标签。很长一段时间以来,我一直在努力完成这项任务。

2 个答案:

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