从 Symfony2 表单存储实体不起作用

Posted

技术标签:

【中文标题】从 Symfony2 表单存储实体不起作用【英文标题】:Storing entities from a Symfony2 Form doesn't work 【发布时间】:2018-04-20 01:49:15 【问题描述】:

我有一个疯狂的问题,我不明白。

我关心的代码是这样的:

 public function appendAction(Request $request, $pKpPatientid)

    if (!$this->isAdmin()) 
        throw new AccessDeniedException();
    
    $entity = new DataDFu1();
    $entity1 = $this->getDoctrine()
        ->getRepository('DataLiveBundle:DataAPatient')
        ->find($pKpPatientid);

   $appendForm = $this->createAppendForm($pKpPatientid,$entity, $entity1);


    $appendForm->handleRequest($request);
   // if ($appendForm->isValid()) 
        if($appendForm->get('submit')->isClicked())//Save
           //return $this->redirect($this->generateUrl('dataapatient_sendMessage', array("pKpPatientid" => $pKpPatientid)));
           $entity->setFu1KfPatientid($entity1);
           $this->storeAppendDataDFu1($entity);

     //   
    

    return $this->render('DataLiveBundle:DataDFu1:form.html.twig', array(
       // 'entity'     => $entity,
        'form'   => $appendForm->createView(),
        'isNew'=> true,
    ));


/**
 * The function createAppendForm
 * Creates a form with the Information from a DataAPatient.
 * @param DataAPatient $pKpPatientid The primary key
 * @return \Symfony\Component\Form\Form
 */
private function createAppendForm($pKpPatientid, $entity, $entity1)
   

    $form = $this->createForm($this->get('data_livebundle.form.dataapatienttype'), $entity1, array(
    //'action' => $this->generateUrl('dataHome'),
    'method' => 'POST'
   ));

    $form->add('submit', 'submit', array('label' => 'Create Fu1'));
    return $form->add('dFu1', new DataDFu1Type(), array('data'=>$entity));



 /**
 * The function storeEditedDataDFu1
 * Persists changes made to an existing DataDFu1 entity to the database
 * @param  DataDFu1 entity
 * @return DataAPatient $pKpPatientid The primary key
 */
public function storeAppendDataDFu1($entity)

    $em = $this->getDoctrine()->getManager();
    $session = $this->getRequest()->getSession();

    if (!$entity) 
        throw $this->createNotFoundException('Unable to find DataDFu1 entity.');
    

    $em->persist($entity);
    $em->flush();
    $session->getFlashBag()->add(
            'notice',
            'Your changes to the DataDFu1 of ID: "'."xyz". '" was saved!'
    );
   // return $entity->getPKpPatientid();

我创建了一个包含两个带有实体的表单并呈现它的表单。它工作得很好。但是在这个时刻,当想要存储(storeAppendDataDFu1)来自实体的数据并且只是来自这个实体时,entity1 会丢失以前在表单中可视化的所有值(只是可视化的)。这意味着这个 entity1 显示的字段以 NULL 值永久存储在数据库中。

即使只为 entity1 () 编程了一个记忆函数,entity1 怎么能持久存储错误的值???

我的假设是它与表单星座有关,因为每当我按下提交时,entity1 的字段都会设置为 NULL。

我希望有人知道这个问题:),我真的找不到解决方案。 *entity 和 entity1 只是连接在一起,因为 entity 的外键是 entity1 的主键,它是 oneToOne 匹配...

我还发现mappingBy null?那是什么意思?会是这个原因吗?

 oneToOne:
    fu1KfPatientid:
        targetEntity: DataAPatient
        cascade:   
        fetch: LAZY
        mappedBy: null
        inversedBy: dFu1
        joinColumns:
            _FU1_kf_PatientID:
                referencedColumnName: __P_kp_PatientID
        orphanRemoval: false

感谢您的反馈...如果您需要更多信息,请告诉我...谢谢

【问题讨论】:

【参考方案1】:

如果实体是相关的,添加适当的映射信息来持久化两个实体不是更好吗?

实体 1

/**
*@ORM\OneToOne(targetEntity="Entity2", cascade="persist")
*
*/
$entity_two_reference;

在表单中,这将是一个 Entity2Type 并且应该像往常一样呈现

当您进行 flush() 时,它应该可以正常工作。

【讨论】:

嗯..我计划用两个不同的实体来做的原因是因为第一个实体不应该改变..但是当我想遵循你的方法时,我必须定义正确的信息? ist 是否适用于两种不同的表单类型?因为现在我为每个实体都有自己的表单类型 我想您已经有了映射信息,因此您不应该更改第一个实体或任何其他实体中的任何内容。您只需更改强制实体的形式并将字段修改为 EntityTwoFormType ,它将呈现和持久化,无需任何额外代码。你能告诉我你的实体,以便我更好地解释我自己吗? 感谢您的反馈,您希望查看哪些文件实体类或实体表格?还是两者兼而有之?【参考方案2】:

现在我发现了问题!问题是我正在使用 Data-Toggle

#<div class="container">
<div class="row">
    <ul class="nav nav-tabs pull-left">
         <li class="active"><a href="#patientInfo" data-toggle="tab">Patient info</a></li>
         <li ><a href="#partI" data-toggle="tab">Part I</a></li>
         <li ><a href="#partII" data-toggle="tab">Part II</a></li>
         <li ><a href="#partIII" data-toggle="tab">Part III</a></li>
    </ul>
    #div class="clearfix">tmp. disable#</div> #

创建一个寄存器布局。我认为这种布局不适用于 Simfony2 Forms。有人体验过哪种寄存器布局适用于 Symfony2 表单吗?

【讨论】:

以上是关于从 Symfony2 表单存储实体不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Sonata Admin 编辑表单多对多不起作用 - symfony2.1.6

使用连接表返回结果的学说不起作用 Symfony2

更新关系映射后,Symfony 2 原则坚持不起作用

VS 2010 - 带有 MySql 存储过程的实体框架似乎不起作用

插入数据库多部分/表单数据不起作用(数据未存储)

LazyInitializationException 和 @Transactional 不起作用