Laravel新手求助:Attempt to read property 'id' on int 报错问题
问题:Laravel中出现「Attempt to read property 'id' on int」报错
当leave_admin表中没有记录时,访问请假视图页面会触发该错误,寻求解决帮助。
控制器代码
public function leaves() { $leaves = DB::table('leaves_admin') ->join('users', 'users.rec_id', '=', 'leaves_admin.rec_id') ->select('leaves_admin.*','users.role_name','users.name','users.avatar') ->get(); return view('leave.leaves',compact('leaves')); } public function approved($id) { try{ $leaves = LeaveAdmin::find($id); $leaves->status='Approved'; $leaves->save(); DB::commit(); Toastr::success('Leave Request Approve Successfully','Success'); return redirect()->back(); } catch(\Exception $e) { DB::rollback(); Toastr::error('Failed to Approve Request','Error'); return redirect()->back(); } }
路由代码
Route::get('/leaves/new', 'leaves')->middleware('auth')->name('LeavesNew'); Route::get('/leaveApprove/{id}', 'approved')->middleware('auth')->name('Approved');
视图代码
<!-- Approve Leave Modal --> <div class="modal custom-modal fade" id="approve_leave" role="dialog"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content"> <div class="modal-body"> <div class="form-header"> <h3>Leave Status</h3> <p>What do you want to do with this request?</p> </div> <div class="modal-btn delete-action"> <div class="row"> <div class="col-6"> <a href="{{ route('Approved', $leaves->id) }}" class="btn btn-primary continue-btn">Approve</a> </div> <div class="col-6"> <a href="javascript:void(0);" data-dismiss="modal" class="btn btn-primary cancel-btn">Reject</a> </div> </div> </div> </div> </div> </div> </div>
报错详情
报错内容:Attempt to read property 'id' on int
触发场景:leave_admin表无任何记录时,打开请假视图页面。
问题原因及解决方法
1. 视图中错误使用集合变量
控制器通过get()获取的$leaves是集合(数组),不是单个模型实例。当表中无记录时,$leaves为空集合,直接在视图中调用$leaves->id会触发错误(空集合在某些场景下会被解析为int类型的0)。
解决:
视图中必须遍历集合,针对每条记录操作:
@if($leaves->isEmpty()) <p>暂无请假申请记录</p> @else @foreach($leaves as $leave) <!-- 每条请假记录的展示代码 --> <button data-toggle="modal" data-target="#approve_leave_{{$leave->id}}">处理申请</button> <!-- 为每条记录生成独立模态框 --> <div class="modal custom-modal fade" id="approve_leave_{{$leave->id}}" role="dialog"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content"> <div class="modal-body"> <div class="form-header"> <h3>Leave Status</h3> <p>What do you want to do with this request?</p> </div> <div class="modal-btn delete-action"> <div class="row"> <div class="col-6"> <a href="{{ route('Approved', $leave->id) }}" class="btn btn-primary continue-btn">Approve</a> </div> <div class="col-6"> <a href="javascript:void(0);" data-dismiss="modal" class="btn btn-primary cancel-btn">Reject</a> </div> </div> </div> </div> </div> </div> </div> @endforeach @endif
2. 控制器approved方法的漏洞
当find($id)找不到对应记录时,$leaves为null,直接赋值$leaves->status会触发新错误,同时原代码缺少事务开启语句。
优化代码:
public function approved($id) { try{ DB::beginTransaction(); // 补充开启事务 $leaves = LeaveAdmin::find($id); if(!$leaves){ Toastr::error('请假记录不存在','Error'); return redirect()->back(); } $leaves->status='Approved'; $leaves->save(); DB::commit(); Toastr::success('请假申请已通过','成功'); return redirect()->back(); } catch(\Exception $e) { DB::rollback(); Toastr::error('请假申请通过失败','错误'); return redirect()->back(); } }
内容的提问来源于stack exchange,提问作者Jay-ar Cristobal
相关产品推荐
相关产品推荐

