Symfony 实体持久为空

Symfony entity persist null

我有一个常规的 formType,其中包含一些非必需的可为 null 的元素,如下所示:

->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(),
    );
}

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

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

因此,它将时间设置为 00,我可能会使用它...但是: - 重新加载时页面仍显示旧值。我认为这是正常的,因为 $editForm 是在 isValid() 检查之前声明的(显然)并且没有更新。 - 它远非理想,因为在数据库中存储 00:00 比 NULL 更不相关。

你能试试(第二次编辑)这个吗:

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

我认为这是正确的代码。目前在您发布的代码中,您没有对表单或实体做任何事情,所以没有任何改变。您需要对表单或实体做一些事情,然后持久化并刷新它以查看数据库中的任何内容。

以上代码可能无法运行,但请尝试一下,希望您能理解。

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

我认为上面的代码可能有效。尝试一下。希望有用。

感谢和问候。