即使在迁移中设置了默认值,批量分配也无法处理Null输入。对此有什么解决方案?

时间:2019-05-29 04:38:40

标签: laravel eloquent mass-assignment

我经常使用大众分配。最近,我遇到了这个问题,我在其中创建了fillable,并且还默认使用null值,但是在使用批量分配时,如果我的输入为空,则会返回“ Cannot Be Null”错误。

我的模型

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

我的控制器

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

我的迁移

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

以上所述是否意味着当我在输入字段status上不提供任何内容时,它应该默认为0吗?但是不能抛出null列。

对此有什么解决办法吗?

2 个答案:

答案 0 :(得分: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
];

您可以删除它,也可以保留它,然后编写一种方法来补偿所有输入。我只是简单地删除了它,然后设置了一个变量器,以执行中间件对那些我想为空的输入的操作。

HTH

答案 1 :(得分:1)

我猜您有问题,因为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);