我将一些来自表单(由CodeIgniter管理)的值保存到简单的Doctrine实体中。我的某些字段是可选的。
控制器的示例代码:
$entity->setDistance($this->input->post('distance'));
$entity->setKilometricRate($this->input->post('kilometric_rate'));
$this->getEntityManager()->persist($entity);
$this->getEntityManager()->flush($entity);
当我不填写表单中的某些字段时,则0持久化到数据库中(因为php将“”转换为0)。
实体的示例代码:
/**
* @var float|null
*
* @ORM\Column(name="distance", type="float", precision=53, scale=0, nullable=true)
*/
private $distance;
/**
* @var float|null
*
* @ORM\Column(name="kilometric_rate", type="float", precision=53, scale=0, nullable=true)
*/
private $kilometricRate;
是否有一种方法可以告诉Doctrine保存NULL
值而不是0
或空字符串,而无需测试所有设置器中的所有字符串?
目前,我正在使用自定义帮助程序,但我很确定有更好的方法来实现此目的。
助手:
public function getValueOrNull(?string $postedVal):?string{
if ($postedVal==="0") return "0";
return (!empty($postedVal) ? $postedVal : null);
}
答案 0 :(得分:0)
您可以在多个地方解决此问题。例如,您可以检查CodeIgniter如何处理表单并确保空白字段返回null。我对CI的了解不够,无法说出它的简易性以及在何处可能引起副作用。
您还可以在您的实体中处理此问题,确保每当有人使用空字符串设置值时,该值都将转换为null:
class MyEntity
{
// ...
public function setDistance($distance)
{
if ($distance === '') {
$distance = null;
}
$this->distance = $distance;
}
}
如果您希望始终将其用于浮点数,则可以创建一个扩展浮点数的自定义类型并修改方法convertToPHPValue
。参见https://www.doctrine-project.org/projects/doctrine-dbal/en/2.9/reference/types.html#custom-mapping-types