Symfony实体保持null

时间:2017-02-21 19:08:35

标签: symfony symfony-forms

我有一个常规的formType,带有一些非必需的,可空的元素,如:

->add('mytime', TimeType::class, array(
    'input'  => 'datetime',
    'widget' => 'single_text',
    "required" => false
))

在实体中:

/**
 * @var \DateTime
 *
 * @ORM\Column(name="mytime", type="time", nullable=true)
 */
private $mytime = null;

如果我在插入新记录时没有定义它,它可以工作 - 它是NULL。但是如果我确定它并稍后尝试通过更新表单来删除它,它就不会更新并保持它的价值。

在我检查的isValid()区块中:

$data = $editForm->all();
print_r($data['mytime']->getData());

它实际上是空的。在实体中相同:

$entity->getMyTime()

是空的。但是当我

$em->persist($entity);
$em->flush();

mytime仍有其旧值。

我错过了什么?

[编辑]按要求,完整的控制器代码:

public function myFunctionAction(Request $request ,$id, $to) {
    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository(Day::class)->find($id);

    $editForm =  $this->createForm(new DayType(), $entity);
    $editForm->add('submit', 'submit', array('label' => 'Update'));

    $editForm->handleRequest($request);
    if ($editForm->isSubmitted() && $editForm->isValid()) {
        $em->persist($entity);
        $em->flush();
    }

    return array(
        'entity'      => $entity,
        'to'          => $to,
        'edit_form'   => $editForm->createView(),
    );
}

[EDIT2] 在对我从答案中得到的想法进行一些测试之后,我在isValid()部分尝试了这个:

if(is_null($entity->getMyTime()) || empty($entity->getMyTime()))
    $entity->SetMyTime((new \DateTime())->setTime(00, 00));

所以,它将时间设置为00,我可能会使用它......但是: - 重新加载时的页面仍显示旧值。我认为这是正常的,因为$editFormisValid()之前被宣布(显然)并且没有更新。 - 它远非理想,因为在DB中存储00:00与NULL无关。

2 个答案:

答案 0 :(得分:1)

你能尝试(第二次编辑):

...
$editForm->get('mytime')->setData(new \DateTime());
...
if ($editForm->isSubmitted() && $editForm->isValid()) {
    $em->persist($entity);
    $em->flush();
}

我认为这是正确的代码。目前在您发布的代码中,您不对表单或实体执行任何操作,因此没有任何更改。您需要对表单或实体执行某些操作,然后保留并刷新它以查看数据库中的任何内容。

上面的代码可能不起作用,但试一试,希望你能得到这个想法。

答案 1 :(得分:1)

if ($editForm->isSubmitted() && $editForm->isValid()) {
    if(is_null($entity->getmytime()) || empty($entity->getmytime())) {
        $entity->setMytime(null);
    }
    $em->persist($entity);
    $em->flush();
}

我认为上面的代码可能有效。试试吧。希望它有效。

谢谢&问候。