首页 > 解决方案 > 在 Laravel 中保存员工编号会引发遇到 A non-numeric value 的错误

问题描述

我正在尝试将员工编号保存为 EMP00001 格式。我在 store 下的控制器中使用了以下代码,并且遇到了 A non-numeric value 的错误。

 $emp = Employee::create($request->all()+
        ['employee_number' => Employee::max('employee_number') + 1 ]);
        $employee_code =  sprintf ("EMP",'%06d');
        $employee_no = ($employee_code +$emp);
        $employee_no->save();

employee_number 的 MySQL 列是 varchar。谁能看到我做错了什么?

标签: phplaravel

解决方案


它会抛出这样的错误,因为Employee::max('employee_number')返回一个字符串,它是 varchar 列类型,因为您以EMP00001. 您为 PHP 设置了严格的类型,这很好。尝试在主查询之外调用它,提取号码,添加号码并进行插入:

$num_employee_max = Employee::max('employee_number');
$num_employee = (int)str_replace('EMP', '', $num_employee_max);
$new_num_employee = $num_employee + 1;
$employee_code = sprintf('EMP%06d',$new_num_employee);
 $sanitized values = $request->all(); //do the proper sanitization instead of this

 $emp = Employee::create( $sanitized values +
        ['employee_number' =>  $employee_code]);

注意:避免直接在数据库中从输入中插入未经处理的值。

另外, sprintf ("EMP",'%06d'); 不做任何事情。了解 sprintf: http: //php.net/manual/en/function.sprintf.php


推荐阅读