Symfony 2形式:实体小部件多对一/一对多关系-关系不持久


Symfony 2 form : entity widget with many to one/one to many relation - relation not persisting

我有一个审计表单,我可以附加几个资源(审计有许多资源,一个资源只附加到一个审计)。

表单在视图中显示得很好,但是,在保存表单时,选中的资源没有附加到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()));
}