Symfony2嵌入式表单,如何持久化对象

Symfony2嵌入式表单,如何持久化对象,symfony,Symfony,我正在尝试使用任务和标记实体One2Many实现(Symfony2,2.7) 要将对Task对象的引用保存到标记记录中,我只能通过以下方式定义Task的createAction(): 根据@Cerad comment,您唯一要做的就是持久化任务 由于关联映射中的cascade={“persist”},所有相关标记将自动持久化 您的代码应该是: if ($form->isValid()) { $em = $this->getDoctrine()->getManager()

我正在尝试使用任务和标记实体One2Many实现(Symfony2,2.7)

要将对Task对象的引用保存到标记记录中,我只能通过以下方式定义Task的createAction():


根据@Cerad comment,您唯一要做的就是持久化
任务

由于关联映射中的
cascade={“persist”}
,所有相关标记将自动持久化

您的代码应该是:

if ($form->isValid()) {
    $em = $this->getDoctrine()->getManager();
    $em->persist($task);
    $em->flush();

    return $this->redirect($this->generateUrl('MyName_Task_show', array('id' => $task->getId())));
}

请参阅条令文档的和章节。

不,您不需要遍历所有的
标记
并显式设置
任务
,如果您正确配置它,Symfony将为您执行此操作

唯一需要添加的是在表单生成器中通过引用将
设置为
false
。在这种情况下,symfony将在每个
标记上显式调用
setTask


有关更多信息

您只需坚持执行任务即可。cascade=persist将负责保留标记。谢谢。实际上,我有一个三层的工作/任务/标签情况。这有区别吗?我将尝试修复或提出另一个问题。只要您在关系上正确设置了cascade=persist,则只需一个persist即可。@Cerad,all,如果您发现问题,我很感激在开始新问题之前,您确实应该完成此问题。你有两个正确答案。真的应该接受一个或说明为什么不接受。这里不需要参考。他的setTag实现负责交叉引用。他也可以删除该行。不确定您所说的是哪一行,但$tag->setTask($this)行应该保留,这样可以更轻松地保持对象引用的同步。
class Task{
....
 /**
 *
 * @ORM\OneToMany(targetEntity="Tag", mappedBy="Task", cascade={"persist"} )
 */
private $Tags;
....
 /**
 * Add tag
 *
 * @param \MyName\Bundle\BlogBundle\Entity\Tag $tag
 *
 * @return Task
 */
public function addTag(\MyName\Bundle\BlogBundle\Entity\Tag $tag)
{
    $this->tags[] = $tag;
    $tag->setTask($this);
    return $this;
}
}
if ($form->isValid()) {
    $em = $this->getDoctrine()->getManager();
    $em->persist($task);
    $em->flush();

    return $this->redirect($this->generateUrl('MyName_Task_show', array('id' => $task->getId())));
}