我正在尝试使用任务和标记实体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;
}
}
答案 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 associations和Cascade operations章节。