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();
}
我认为上面的代码可能有效。尝试一下。希望有用。
感谢和问候。
我有一个常规的 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();
}
我认为上面的代码可能有效。尝试一下。希望有用。
感谢和问候。