即使在迁移时设置了默认值,批量分配也不会处理 Null 输入。对此有啥解决方案吗?

Posted

技术标签:

【中文标题】即使在迁移时设置了默认值,批量分配也不会处理 Null 输入。对此有啥解决方案吗?【英文标题】:Mass assignment won't handle Null input even when default is set on migration.Any solution to this?即使在迁移时设置了默认值,批量分配也不会处理 Null 输入。对此有什么解决方案吗? 【发布时间】:2019-10-14 15:08:22 【问题描述】:

我一直在使用批量分配。我最近遇到了这个问题,我创建了可填充的,并且还默认为空值,但是在使用批量赋值时,如果我的输入为空,它会返回“不能为空”错误。

我的模型

protected $fillable = ['name','status'];

我的控制器

$this->model->create($request->all());

我的迁移

$table->boolean('status')->default(0);

上述不应该是说当我在输入字段status上什么都不提供时,它应该默认为0吗?但是列不能是null 被抛出。

有什么解决办法吗?

【问题讨论】:

0 不是null。您的迁移未将字段设置为可为空。 【参考方案1】:

我自己也遇到过。查看您的 app\Http\Kernel.php 文件。有一个 Laravel 中间件可以将你的空输入转换为空值。因此,即使您正确设置了质量分配,并且迁移默认为 0,此中间件也会在到达这些点之前更改值。您要查找的代码类似于:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, // <<-- This one
];

您可以删除它,或者保留它并编写一个方法来补偿所有输入。我只是删除了它,然后设置了一个 mutator 来执行中间件对我想要为 null 的输入所做的操作。

HTH

【讨论】:

是的,但我使用的是布尔值,当我不转换EmptyStringToNull 时,我传递了一个空字符串,用于布尔值,并且在我的迁移中仍然没有默认为0。为此可以做些什么? 在模型上添加一个mutator。如果该值为空或 null,则将该值设置为 0。【参考方案2】:

我猜你的问题是因为 ConvertEmptyStringsToNull 添加到 laravel >= 5.4 的中间件。该中间件将所有空字符串转换为null。因此,如果您没有为status 字段设置任何值,它将是null。您的迁移不是-&gt;nullable(),所以会抛出错误Cannot Be Null

你可以这样解决:

$all = $request->all();

if(is_null($request->get('status')))

     unset($all['status']);


$this->model->create($all);

【讨论】:

@Manishbasnyat182 我为您的情况添加了解决方案。 我可以调整一些东西,但我只是在寻找一个我不会通过这些检查的选项。不过感谢您的帮助。

以上是关于即使在迁移时设置了默认值,批量分配也不会处理 Null 输入。对此有啥解决方案吗?的主要内容,如果未能解决你的问题,请参考以下文章

为什么即使分配了默认的mysql值,布尔属性也保存为null

当我动态更改其框架时,即使重新加载后 UITableView 内容大小也不会更新

为啥传递给函数的协议默认值不会改变,即使函数在子类化时会改变?

如果请求值为空,Laravel 设置默认值

以前的笔记迁移__形參,实參,递归

即使在 rewriteBatchedStatements = true 之后,mysql jdbc 也不会批处理查询