我有一个审计表单,我可以附加几个资源(审计有许多资源,一个资源只附加到一个审计)。
表单在视图中显示得很好,但是,在保存表单时,选中的资源没有附加到DB中的审计。
审核表格:
>add('ressources', 'entity', array(
'class' => 'SpriMonitorBusinessBundle:Ressource',
'query_builder' => $this->em->getRepository('SpriMonitorBusinessBundle:Ressource')->getAvailableRessources(true),
'multiple'=>true
))
Audit.orm.yml:
oneToMany:
ressources:
targetEntity: Ressource
mappedBy: audit
Ressource.orm.yml:
manyToOne:
audit:
targetEntity: Audit
inversedBy: ressources
joinColumn:
name: audit_id
referencedColumnName: id
N。B:在资源表单上,当我选择审计时,它被正确保存为
控制器:
public function newAction()
{
$em = $this->getDoctrine()->getEntityManager();
$item = AuditFactory::make();
$form = $this->createForm(new AuditType($em),$item);
$request = $this->get('request');
$session = $this->get('session');
if ('POST' == $request->getMethod()) {
try {
$this->validateForm($form,$request);
$em->persist($item);
$em->flush();
$message = $this->container->getParameter('form_submit_success');
$session->setFlash('success', $message);
$url = $this->generateUrl('Spri_audit_list');
return $this->redirect($url);
} catch (FormException $e) {
$session->setFlash('error', sprintf('Erreur Formulaire : "%s"',$e->getMessage()));
} catch ('Exception $e) {
die(var_dump($e->getMessage()));
$session->setFlash('error', sprintf('Erreur inconnue ! Contactez l''ADMIN'.$e->getMessage()));
}
}
return $this->render('SpriAuditBundle:Audit:new.html.twig', array('form'=>$form->createView()));
}
protected function validateForm($form, $request)
{
$form->bind($request);
if (!$form->isValid()) {
$message = $this->container->getParameter('form_submit_error');
throw new FormException($message);
}
}
var_dump ($ item)显示:
private 'slug' => null
private 'ressources' =>
object(Doctrine'Common'Collections'ArrayCollection)[4190]
private '_elements' =>
array
0 =>
object(Spri'MonitorBusinessBundle'Entity'Ressource)[3766]
...
privat...
任何想法?
您必须通过编辑该实体的addRessource()
方法来手动设置Ressource
实体中的Audit
实体。
只需像这样编辑这个方法:
public function addRessource(Ressource $ressource)
{
$this->ressources[] = $ressource;
$ressource->setAudit($this);
return $this;
}
乌利希期刊指南
然后尝试在控制器中手动持久化资源:
foreach ($audit->getRessources() as $ressource) {
$em->persist($ressource);
}
乌利希期刊指南
,奇怪。执行下一个代码片段并检查资源关系:
$em = $this->getDoctrine()->getManager();
$ressource = new Ressource();
$ressource->setSomeRequiredFieldValue($someValue);
$audit = new Audit();
$audit->setSomeRequiredFieldValue($someValue);
$audit->addRessource($ressource);
$em->persist($audit);
$em->persist($ressource);
$em->flush();
好了,我想我知道是怎么回事了。这个更新的控制器应该可以解决你的问题:
public function newAction()
{
$em = $this->getDoctrine()->getEntityManager();
$item = AuditFactory::make();
$form = $this->createForm(new AuditType($em),$item);
$request = $this->get('request');
$session = $this->get('session');
if ('POST' == $request->getMethod()) {
try {
$this->validateForm($form,$request);
$newItem = $form->getData();
$em->persist($newItem);
$em->flush();
$message = $this->container->getParameter('form_submit_success');
$session->setFlash('success', $message);
$url = $this->generateUrl('Spri_audit_list');
return $this->redirect($url);
} catch (FormException $e) {
$session->setFlash('error', sprintf('Erreur Formulaire : "%s"',$e->getMessage()));
} catch ('Exception $e) {
die(var_dump($e->getMessage()));
$session->setFlash('error', sprintf('Erreur inconnue ! Contactez l''ADMIN'.$e->getMessage()));
}
}
return $this->render('SpriAuditBundle:Audit:new.html.twig', array('form'=>$form->createView()));
}