Php Symfony 2表单:具有多对一/一对多关系的实体小部件-关系不持久
我有一个审计表,我可以在其中附加多个资源(审计有多个资源,一个资源只附加一个审计) 表单在视图中显示良好,但在保存表单时,所选资源未附加到数据库中的审核 审核表:Php Symfony 2表单:具有多对一/一对多关系的实体小部件-关系不持久,php,symfony,orm,doctrine-orm,symfony-forms,Php,Symfony,Orm,Doctrine Orm,Symfony Forms,我有一个审计表,我可以在其中附加多个资源(审计有多个资源,一个资源只附加一个审计) 表单在视图中显示良好,但在保存表单时,所选资源未附加到数据库中的审核 审核表: >add('ressources', 'entity', array( 'class' => 'SpriMonitorBusinessBundle:Ressource', 'query_builder' => $this->em->getRepository
>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:在Ressource表单上,当我选择一个审核时,它被正确保存
控制器:
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);
}
}
foreach ($audit->getRessources() as $ressource) {
$em->persist($ressource);
}
变量转储($item)显示:
有什么想法吗?好吧,我想我知道发生了什么。此更新的控制器应修复您的问题:
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()));
}
好吧,我想我知道怎么回事了。此更新的控制器应修复您的问题:
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()));
}
您必须通过编辑实体的
addRessource()
方法,在Ressource
实体中手动设置Audit
实体
只需编辑此方法,如下所示:
public function addRessource(Ressource $ressource)
{
$this->ressources[] = $ressource;
$ressource->setAudit($this);
return $this;
}
UPD
然后尝试在控制器中手动持久化资源:
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);
}
}
foreach ($audit->getRessources() as $ressource) {
$em->persist($ressource);
}
UPD
嗯,奇怪。执行下一个代码段并检查资源关系:
$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();
您必须通过编辑实体的
addRessource()
方法,在Ressource
实体中手动设置Audit
实体
只需编辑此方法,如下所示:
public function addRessource(Ressource $ressource)
{
$this->ressources[] = $ressource;
$ressource->setAudit($this);
return $this;
}
UPD
然后尝试在控制器中手动持久化资源:
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);
}
}
foreach ($audit->getRessources() as $ressource) {
$em->persist($ressource);
}
UPD
嗯,奇怪。执行下一个代码段并检查资源关系:
$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();
能否将控制器发布到持久化的位置并刷新实体管理器?如果在持久化之前执行var_dump($item),它是否将资源显示为子项?我们还需要查看您的创建操作。@kenchannel:请查看已编辑的问题@Lighthart:什么创建操作?你能将你的控制器发布到持久化的地方并刷新实体管理器吗?如果你在持久化之前做了一个var_dump($item),它是否将资源显示为子项?我们还需要查看你的创建操作。@Kenchannel:请查看编辑过的问题@Lighthart:什么创建操作?我仍然有相同的结果。我能想到的最后一件事是尝试向Ressource实体添加级联持久化。我看不出你在想什么!?正在添加的资源,它们是作为新资源实体插入的,还是它们已经在数据库中被管理的实体?它们已经存在于数据库中,我只在审核表单中选择了它们,但结果仍然相同。我想不出的最后一件事是尝试向Ressource实体添加级联持久化。我看不出您在想什么!?正在添加的资源,它们是作为新资源实体插入的,还是它们已经在数据库中被管理的实体?它们已经存在于数据库中,我只在审核表单中选择它们。您是否添加了“cascade:[persist]”(不确定语法,我从不使用架构文件)是否指向架构中审核实体的resources属性?是:oneToMany:ressources:targetEntity:Ressource mappedBy:Audit级联:[“持久”、“合并”]我已更新了答案。我确信我的答案中的第一步应该是有效的。同时尝试将Symfony更新到最新版本。我按照你的要求做了,但没有任何更改!我有一个Symfony版本2.2.0您是否已将“cascade:[persist]”(不确定语法,我从不使用架构文件)添加到架构中审核实体的resources属性中?是:oneToMany:ressources:targetEntity:Ressource mappedBy:Audit cascade:[“persist”,“merge”]我已更新了答案。我确信我的答案中的第一步应该是有效的。同时尝试将Symfony更新到最新版本。我按照你的要求做了,但没有任何更改!我有一个Symfony版本2.2.0