Laravel报Trying to get property 'cm_number' of non-object错误
问题定位
报错Trying to get property 'cm_number' of non-object直接触发点在getCMNumber()方法:
当变更工单表为空(系统首次提交工单,无任何历史记录)时,ChangeManagement::orderBy('cm_id','desc')->first()查询结果为null,代码未做判空直接访问$cm->cm_number,尝试读取空值的属性就会抛出该错误。
修复步骤
1. 修正编号生成方法
补全空表场景兼容,同时修正原方法中substr序号截取参数错误、初始序号从000开始不符合业务习惯的问题,修正后代码如下:
public static function getCMNumber() { $latestRecord = ChangeManagement::orderBy('cm_id','desc')->first(); $currentDate = date('Y-m-d'); $prefix = "-CM-"; $firstSerial = "001"; // 无历史工单直接返回当日首条编号 if (!$latestRecord) { return $currentDate . $prefix . $firstSerial; } $lastNumber = $latestRecord->cm_number; $lastDate = substr($lastNumber, 0, 10); // 截取3位流水号,原代码长度参数17为笔误 $lastSerial = (int)substr($lastNumber, 14, 3); if ($lastDate == $currentDate) { $newSerial = str_pad($lastSerial + 1, 3, '0', STR_PAD_LEFT); return $currentDate . $prefix . $newSerial; } return $currentDate . $prefix . $firstSerial; }
2. 修复其他隐含代码bug
原代码中还有多处会触发运行错误的笔误和逻辑漏洞,需要一并修正:
- 员工信息查询判空:
$userEmployment = UserEmployment::where('emp_xuser',Auth::user()->status_xuser)->first();若未查询到对应员工记录,后续访问$userEmployment->emp_xdepartment会触发同类非对象报错,需补充判空逻辑,查询失败时返回友好提示。 - 阶段赋值变量名笔误:
switch分支中除UR节点外,其余节点都将审批人赋值给了未使用的$cmstg_user变量,后续写入$cmstg_stageuser时会报未定义变量错误,需统一将分支内变量名改为$cmstg_stageuser。 - 模型类名拼写错误:
new ChangeManangementStages中类名多写了一个n,正确拼写应为ChangeManagementStages,否则会触发类不存在错误。 - 附件上传变量笔误:附件写入逻辑中
$prupload->pr_number =$pr->pr_number;里的$pr变量未定义,应改为$cm->cm_number,否则会触发未定义变量错误。
验证方式
修复后先清空表测试首条工单提交,再测试同天多工单、跨天工单的编号生成规则是否符合预期,同时覆盖有附件、无附件两种提交场景,确认流程跑通。
内容的提问来源于stack exchange,提问作者retorado001
相关产品推荐
相关产品推荐

