Laravel报错:尝试获取非对象的'totalInterestPaid'属性但对象实际存在问题排查求助
排查Laravel "尝试获取非对象属性" 的诡异问题
我太懂这种明明调试显示是对象但代码报错的抓狂感了!结合你的描述,咱们一步步来排查:
1. 先堵死「查询无结果」的可能性
虽然你用dd()看到的是有效对象,但某些请求场景下,where('loansID', $loan->id)可能找不到匹配的记录,这时候first()会返回null,自然就会报"获取非对象属性"的错误。毕竟你说白天正常晚上出问题,很可能是这段时间新增/删除了贷款相关数据,刚好触发了无匹配的情况。
建议先给代码加个存在判断:
$balanceToPush = DB::table('loan_balances') ->where('loansID', $loan->id ) ->first(); // 先检查是否拿到了有效记录 if (!$balanceToPush) { // 记录日志方便排查,也可以直接跳过该条数据 \Log::warning('未找到对应贷款余额记录', ['loan_id' => $loan->id]); continue; // 如果是循环场景用continue,非循环可以用return或其他逻辑 } // 再执行后续赋值操作 $balanceToPush->totalPaid = number_format( $balanceToPush->totalInterestPaid + $balanceToPush->totalTaxPaid + $balanceToPush->totalPrincipalPaid, 2, '.', ',' ); array_push($loanBalancesArray, $balanceToPush);
2. 确认变量是否被意外覆盖
有没有可能在这段代码的前后逻辑里,$balanceToPush被重新赋值成了非对象(比如数组、null)?比如循环复用变量时的污染?
可以在报错的代码前加个日志,实时打印变量的类型和内容:
// 临时添加日志,看实际请求时的变量状态 \Log::info('当前balanceToPush状态:', [ 'type' => gettype($balanceToPush), 'data' => $balanceToPush ]); $balanceToPush->totalPaid = ...
查看日志里的type是不是object,就能确认是不是变量被篡改了。
3. 试试换用Eloquent模型查询(可选)
你现在用的是DB facade返回的stdClass对象,偶尔会有一些奇怪的隐性问题。如果你的项目有对应的Eloquent模型(比如LoanBalance),可以换成模型查询试试:
// 假设模型类是LoanBalance,记得引入命名空间 $balanceToPush = LoanBalance::where('loansID', $loan->id)->first();
模型返回的是Eloquent对象,属性访问的稳定性会更好一些。
4. 排查定时任务/队列对数据的影响
你休息的几小时里,有没有运行过定时任务、队列任务?这些任务可能修改了loan_balances表的数据(比如删除过期记录、同步数据),导致刚好某个请求的$loan->id对应的记录消失了,触发了无结果的查询。
内容的提问来源于stack exchange,提问作者user11518995
相关产品推荐
相关产品推荐

