You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:39:22