laravel orm:在5.4版本中不将空值转换为列类型的列默认值

时间:2017-05-10 00:43:33

标签: php mysql laravel laravel-5.4

我曾经使用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严格模式已关闭

请注意我知道所有关于可以为空的内容,我不想让这些字段成为可空的,这就是重点......当字段不可为空时,它会自动将空值转换为默认的列类型值

2 个答案:

答案 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();