Laravel 5.4将NULL保存到数据库不工作

时间:2017-04-07 16:43:17

标签: mysql database laravel laravel-5 laravel-5.4

以下代码在数据库中产生一个空值,当我从数据库中得到一个空字符串时。

$customer->update(['company' => NULL]);

2 个答案:

答案 0 :(得分:6)

你应该考虑三件事:

1)确保表格中company的{​​{1}}列。如果不是,就不可能将nullable放在那里。

2)确保您拥有null模型列$fillable的{​​{1}}属性

3)确认您的Customer模型中没有任何mutator - 因此请验证您没有company方法,如果将其设置为null,则可能会自动将值更改为空字符串

答案 1 :(得分:1)

<强>解

如果你想让数据库中的一个字段为null而你不使用mutator,一切都很好。

您使用的是mutator,在我的例子中是以下代码段。

public function setCompanyAttribute($value)
{
    $this->attributes['company'] = ucfirst($value);
}

然后你需要检查$ value是否为null然后手动设置为null,否则它将是一个空字符串。

要在每个模型上自动执行此操作,您可以在EventServiceProvider中将空字符串设置为null。

Event::listen('eloquent.saving: *', function ($eventName, array $data) {
    $attributes = [];

    foreach ($data as $model) {
        foreach( $model->getAttributes() as $key => $value ) {
            $attributes[$key] = (is_string($value) && $value === '') ? null : $value;
       }

        $model->setRawAttributes($attributes);
    }

    return true;
});

首先检查模型中的所有属性并将其设置为临时数组非常重要。现在,在模型实例的setAttribute()方法内,如果存在mutator,则完成检查。但这正是你不想要的,因为它会将一个定义的mutator设置为空的刺。而是使用setRawAttribute,以便使用临时数组中的旧属性覆盖旧属性。

这样做是安全的,因为如果选中的值不是空字符串,则对该字段采用已存在的值。否则,如果它是一个空字符串,则设置为null。

希望它有所帮助!