从POST保存空字符串时,Doctrine的默认行为是什么?我想保存NULL值

时间:2019-02-26 22:14:05

标签: codeigniter orm doctrine http-post codeigniter-3

我将一些来自表单(由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);
}

1 个答案:

答案 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

相关问题