【问题标题】:Laravel can't insert blank value into nullable DB fieldLaravel 无法将空白值插入可为空的数据库字段
【发布时间】:2017-09-11 01:59:43
【问题描述】:

我的数据库表中有一个名为service_3_total 的字段,其类型为decimal(10,2)。我在迁移中将其设置为nullable() 字段,因此在我的数据库中为 Null = Yes 和 Default = NULL。

如果我在提交表单时将此字段留空,则会收到以下错误:

一般错误:1366 不正确的十进制值:'' for column 'service_3_total'

我不知道为什么我会得到这个,因为我允许这个字段在数据库中为空。我认为这与它是十进制数据类型有关。

有什么想法吗?

【问题讨论】:

  • 您可能将错误类型的数据传递到该列。愿意分享一些代码吗?
  • 没有数据,该字段为空白,因为我没有在该字段中插入值。当我检查这里提交的表单数据时,我得到了该字段:"service_3_total" => ""

标签: php mysql laravel decimal


【解决方案1】:

在您的评论中,您声明要插入的变量的值是:

"service_3_total" => ""

空字符串!== null

您传递的是一个空白字符串而不是 null,因此 MySQL 在尝试将 "" 解析为数字时出错。

这样的东西可以在你的代码中工作。只需在插入之前添加它。 (根据您的用例使其更优雅,这只是为了使其正常工作)

if (!$data['service_3_total']) {
    $data['service_3_total'] = null;
}

当你现在尝试这个时,MySQL 会正确地将该值识别为 null 并将其输入数据库中,空白字符串将不起作用。

【讨论】:

    【解决方案2】:
    class YourModel extends Model
    {
        protected static function boot()
        {
            static::creating(function ($model) {
                $model->service_3_total = empty($model->service_3_total) ? null : $model->service_3_total ;
            });
    
            static::updating(function ($model) {
                $model->service_3_total = empty($model->service_3_total) ? null : $model->service_3_total ;
            });
        }
    
    }
    

    您可以在创建/更新之前使用函数将模型内部的blank 值转换为null,以防止弄乱控制器,让我们model 管理数据

    【讨论】:

      【解决方案3】:

      "service_3_total" => ""。如果将列值设置为空字符串并传递要执行的整个数组,则会出现错误,因为空字符串是字符串类型并且不等效于 NULL。您应该在数组中取消设置此键,以便 SQL 执行默认值。

      【讨论】:

        猜你喜欢
        • 2019-04-29
        • 2019-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多