【问题标题】:Laravel 5.4 save NULL to database not workingLaravel 5.4 将 NULL 保存到数据库不起作用
【发布时间】:2017-04-07 16:43:17
【问题描述】:

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

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

【问题讨论】:

  • 当你从 db 中取出时你想要 NULL 吗?
  • @dparoli 是的,该字段是可选的,它可以为 null,所以如果它为 null,我想获取 null 而不是空字符串,以及数据库中的空字段

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


【解决方案1】:

你应该考虑三件事:

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

2) 确保您在Customer 模型列company$fillable 属性中拥有company

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

【讨论】:

  • 谢谢你的回答,我发现错误有一个公司的突变体://
【解决方案2】:

解决方案

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

你是否使用了一个mutator,在我的例子中是下面的sn-p。

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。

希望对你有帮助!

【讨论】:

  • 这是很奇怪的更改接受您的并呈现原始问题中未提供的代码
  • @MarcinNabiałek 对不起,我把它改回来了。认为这对下一位读者了解我如何修复它会有所帮助。您的答案列出了一些必须审查的部分,但我提出了一个可能的解决方案。
猜你喜欢
  • 2018-03-04
  • 2014-06-13
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多