2017-04-07 49 views
0

以下代码导致数据库中出现空值,并且当我从数据库中获取空值时,它将返回一个空字符串。Laravel 5.4将NULL保存到数据库不起作用

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

并且当你从db中取出时你想要NULL吗? – dparoli

+0

@dparoli是的,该字段是可选的,它可以为空,所以如果它为空,我希望得到空,而不是一个空字符串,并在数据库中的空字段 –

回答

5

你应该考虑三两件事:

1)确保在nullablecompany列在表格中。如果不是这样,就不可能把null放在那里。

2)请确保您有在Customer模型列的$fillable财产company

3)确认你没有任何突变在Customer模型 - 所以确认你没有setCompanyAttribute方法可能会更改值自动空字符串,如果它设置为null

+0

感谢您的答案,我发现错误一个公司的变种人:// –

1

SOLUTION

如果你想在数据库中的字段为空,你不要每次使用赋值函数事情很好。

您是否在使用mutator,在我的情况下是以下代码片段。

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

然后,你需要检查,如果$值为空,然后手动将其设置为空,否则这将是一个空字符串。

要在每个模型上自动执行该操作,可以在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,以便旧属性被临时数组中的属性覆盖。

这样做很安全,因为如果选中的值不是空字符串,则已为该字段取现有的值。否则,如果它是一个空字符串,则设置为空。

希望它有帮助!

+0

这是很奇怪的改变接受你的和现在的代码没有在原始问题 –

+0

@MarcinNabiałeksry我改变了它。认为下一位读者看看我如何解决它会有所帮助。您的答案列出了一些必须审查的部分,但是我提供了一个可能的解决方案。 –

相关问题