即使在迁移时设置了默认值,批量分配也不会处理 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
。您的迁移不是->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 内容大小也不会更新