使用空字符串更新Nova资源作为字段的默认值

时间:2019-12-12 21:14:37

标签: laravel-nova

我有一个现有的数据模型,该模型具有唯一的索引字符串字段,该字段默认为空字符串。

我在模型中添加了$ attributes属性,以在创建新对象时将其默认为空字符串。很好。

但是,当更新对象并且该字段保持为空时,它将失败,因为该字段返回为空并且DB字段不可为空。我不确定使该字段为nullable()会带来什么影响。太多的代码无法挖掘,因此我无法更改。

我想我可以观察一个事件,并在那里将值从null更改为空字符串,但是我宁愿在Nova中解决这个问题。

无论如何告诉Nova,应该将一个空字段另存为空字符串?

1 个答案:

答案 0 :(得分:0)

简短版本:否。

长版: 无法在Nova中设置。一个空字符串将在HTTP请求中作为null传递。这种行为是Laravel核心的一部分。确保它不会作为Nova的空字符串传递的唯一方法是对其进行表单验证,并将其作为必填字段。

如果您不介意在Laravel应用程序级别上更改代码,则可以通过删除应用程序内核中的ConvertEmptyStringsToNull中间件来禁用此行为。

/app/Http/Kernel.php

protected $middleware = [
    ...
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, // remove this line
];

但是,如果DB字段不可为空,那么该字段必须有一个正确的值吗?我建议将访问器放在模型上以检查空值:

public function setMyFieldAttribute($val)
{
    $this->attributes['my_field'] = $val ?? '';
}

或者,如果您想确定它始终具有值,请为保存事件添加一个观察者(如前所述),并在实际保存数据之前确保该字段具有值。