【问题标题】:Having to define mutators for nullable fields to avoid type errors必须为可空字段定义修改器以避免类型错误
【发布时间】:2017-05-31 17:06:51
【问题描述】:

我正在使用 Laravel 构建一个中型系统。它有大约 120 个表,其中可能有 70 个表有 CRUD。我对所有这些 CRUDS 都有疑问。每次我有不是字符串类型的可空字段时,我都必须定义这种类型的突变器:

public function setCollectionIdAttribute($value)
{
    $this->attributes['collection_id'] = $value ?: null;
}

public function setCompletedAtAttribute($value)
{ 
    $this->attributes['completed_at'] = $value ?: null;
}

我必须这样做,因为在前端表单字段不是必需的,因此如果用户不填写该字段,则后端接收的值是空字符串,因此当它尝试将其保存到数据库类型时抛出错误,所以我上面列出的函数检查值并将它们设置为 null。

Laravel 是否提供了更好的方法来做到这一点?因为我有很多表单,而且每次我有一个非字符串类型的可空字段时都必须定义这些函数并不酷。

【问题讨论】:

  • 是的,它在 MySQL(或 Laravel 支持的任何其他数据库)中称为默认值。
  • 默认值不能解决问题。问题是 Laravel 试图在非字符串类型的字段中插入一个空字符串(“”)。顺便说一句,每次您定义一个可为空的字段时,它都会将默认值设置为空。
  • 我看到了你的挣扎,在 MySQL 中使用默认值并更改请求数据,如果你有任何空字符串,请从数组中删除此类属性。
  • @Kyslik 可能会让您在发表讽刺评论之前仔细研究该问题。
  • 也许这可能是一种方式..通过一些将空字符串值更改为空值的函数发送请求..我会检查是否可以将它放在将在每个请求中执行的某个地方所以我没写很多次

标签: php laravel


【解决方案1】:

我很了解这个问题,并且之前遇到过很多次。对于大多数项目,我创建了一个 Nullable 特征,并将其应用于模型。此 trait 查找 $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',
    ];
}

【讨论】:

  • 兄弟,能否请您解释一下这个问题的原因。因为我没有遇到过这个问题。
  • 这不是问题,它是一个边缘情况,你作为编码人员必须解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 2022-06-28
  • 2020-03-09
  • 2017-08-31
  • 1970-01-01
  • 2021-08-10
  • 2018-09-17
相关资源
最近更新 更多