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

Laravel 5.4 save NULL to database not working

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

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

你应该考虑三件事:

1) 确保 table 中 nullable 中的 company 列。如果不是,则无法将 null 放在那里。

2) 确保 $fillable 属性 of Customer 模型列 company

3) 验证您的 Customer 模型中没有任何突变器 - 因此验证您没有 setCompanyAttribute 方法,如果它被设置为 null,该方法可能会自动将值更改为空字符串

解决方案

如果您希望数据库中的某个字段为空并且不使用修改器,一切都很好。

您使用的是增变器吗,在我的例子中是以下代码段。

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() 方法中,检查是否存在修改器。但这正是您不想要的,因为它会将所有具有定义的增变器的字段设置为空字符串。而是使用 setRawAttribute 以便用临时数组中的属性覆盖旧属性。

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

希望对您有所帮助!