【问题标题】:What is Doctrine default behavior for saving empty strings from POST? I would like to save NULL values从 POST 保存空字符串的 Doctrine 默认行为是什么?我想保存 NULL 值
【发布时间】:2023-03-15 18:52:01
【问题描述】:

我将一些来自表单(由 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 或空字符串,而不测试所有 setter 中的所有字符串?

目前我正在使用自定义助手,但我很确定有更好的方法来做到这一点。

助手:

public function getValueOrNull(?string $postedVal):?string{
    if ($postedVal==="0") return "0";
    return (!empty($postedVal) ? $postedVal : null);
}

【问题讨论】:

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


    【解决方案1】:

    有多个地方可以解决这个问题。例如,您可以检查 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

    【讨论】:

    • 不幸的是,Codeigniter 没有像 Symfony 中那样的empty_data 替换机制,并且可选的空字段在 Symfony 中总是作为 '' 而不是 NULL 发送。我想避免编辑我的众多设置器(用于字符串和数字(​​float 或 int))。我很确定在 Doctrine 和/或 Codeigniter 中有一种方法可以避免这种情况
    • 是的,请参阅底部的链接。在这种情况下,您可能应该为您的实体创建一个自定义 DBAL 类型和/或用您的自定义类型覆盖现有的浮点类型。
    猜你喜欢
    • 2014-02-09
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多