我曾经使用laravel 5.2现在我升级到5.4 我通常使用我的验证来伪装对象,然后将其发送到数据库,如
$validation_rules = ['title'=>'required' , 'number'=>'present|int'];
// do validation
$obj = new Object();
foreach($validation_rules as $k=>$v )
$obj->$k = $request->input($k);
现在如果用户没有发送number
参数,它在我的对象的nnumer属性中将为null或false ...在旧版本中,它会自动更改为该列的默认值... for例如,如果我在插入此对象时number
列类型为int
,则number
列将为0
但是现在这不会发生,而是我得到了这个错误
Integrity constraint violation: 1048 Column 'number' cannot be null
btw严格模式已关闭
请注意我知道所有关于可以为空的内容,我不想让这些字段成为可空的,这就是重点......当字段不可为空时,它会自动将空值转换为默认的列类型值
答案 0 :(得分:3)
在Laravel 5.4中,->default(0)
的概念与Laravel 5.2不同。在5.4中,默认仅在您没有传递任何内容时才有效,所以当您执行
$obj->$k = $request->input($k);
如果$request->input($k)
为null
,则您将null
“插入”不可为空的列,从而导致错误。
所以看来你必须让数据库中的列可以为空并在你的控制器中进行检查:
$obj->$k = $request->input($k) ? $request->input($k) : 0;
答案 1 :(得分:0)
确保您的列“数字”可以为空。如果您使用Laravel迁移来创建表格,则需要将其添加为$table->integer('number')->nullable();