我经常使用大众分配。最近,我遇到了这个问题,我在其中创建了fillable,并且还默认使用null值,但是在使用批量分配时,如果我的输入为空,则会返回“ Cannot Be Null”错误。
我的模型
protected $fillable = ['name','status'];
我的控制器
$this->model->create($request->all());
我的迁移
$table->boolean('status')->default(0);
以上所述是否意味着当我在输入字段status
上不提供任何内容时,它应该默认为0吗?但是不能抛出null
列。
对此有什么解决办法吗?
答案 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);