我正在用Laravel构建一个中大型系统。它有大约120个表,其中70个表有CRUD。我对所有这些CRUD都有疑问。每当我有一个字符串类型的可空字段时,我必须定义这种类型的mutator:
public function setCollectionIdAttribute($value)
{
$this->attributes['collection_id'] = $value ?: null;
}
public function setCompletedAtAttribute($value)
{
$this->attributes['completed_at'] = $value ?: null;
}
我必须这样做,因为在前端表单字段不是必需的,所以如果用户没有填写字段,后端接收的值是空字符串,所以当它试图保存这个抛出数据库类型错误,因此上面列出的函数检查值并将它们设置为null。
Laravel是否提供了更好的方法?因为我有很多表单,并且每次我有一个字符串类型不可为空的字段时都不必定义这些函数。
答案 0 :(得分:1)
我很清楚这个问题并且多次遇到过这个问题。对于大多数项目,我创建了一个Nullable
特征,我将其应用于模型。此特征查找$nullable
属性,循环遍历该数组中定义的属性,如果它们为空,则将其值设置为null
:
trait Nullable
{
public function bootNullable()
{
static::saving(function ($model) {
foreach ((array) $model->nullable as $key) {
if (empty($model->getAttribute($key))) {
$model->attributes[$key] = null;
}
}
});
}
}
然后,您只需将此特征应用于模型并定义$nullable
属性:
class SomeModel extends Model
{
use Nullable;
protected $nullable = [
'foo',
'bar',
'baz',
];
}