Symfony2 Embedded表单,如何持久化对象

时间:2016-02-02 21:05:28

标签: symfony

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

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

/**
 * Creates a new Task entity.
 *
 * @Route("/", name="MyName_Task_create")
 * @Method("POST")
 * @Template("MyNameBundleBlogBundle:Task:new.html.twig")
 */
public function createAction(Request $request)
{
    $task = new Task();
    $form = $this->createCreateForm($task);
    $form->handleRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $tags = $task->getTags();
        foreach($tags as $tg){$tg->setTask($task); $em->persist($tg);}   // <-- do I really need to loop?
        $em->persist($task);
        $em->flush();

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

    return array(
        'entity' => $task,
        'form'   => $form->createView(),
    );
}

编辑:我知道它应该在没有循环的情况下直接工作,但事实并非如此。问题是:我应该找出哪些错误?见related question

注意,我有:

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;
}
}

2 个答案:

答案 0 :(得分:1)

不,您不需要遍历所有tags并明确设置task,如果您正确配置,Symfony会为您执行此操作。

您需要添加的唯一内容是在表单构建器中将by_reference设置为false。在这种情况下,symfony将明确地在每个setTask上调用tag

了解更多信息'by_reference'

答案 1 :(得分:0)

根据@Cerad评论,你唯一需要做的就是坚持Task

由于您的关联映射中的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())));
}

请参阅Doctrine文档的Etablishing associationsCascade operations章节。