Laravel 8中Attempt to read property 'users_id' on null错误修复咨询
修复Laravel中"Attempt to read property 'users_id' on null"错误
错误原因
当前登录用户尚未创建关联的Data88记录,导致$user->detail_data为null,视图中直接访问$user->detail_data->users_id触发了空属性读取错误。
修复方案
方案1:视图中先判断关联是否存在
修改Blade视图代码,先检查关联数据是否存在,再执行后续逻辑:
<div class="form-group"> <label for="exampleInputPassword1">Alamat</label> @if ($user->detail_data) <input type="text" class="form-control" id="alamat" name="alamat" value="{{ $user->detail_data->alamat }}"> @else <input type="text" class="form-control" id="alamat" name="alamat" placeholder="Masukkan Alamat"> @endif </div>
说明:由于hasOne关联的匹配逻辑是users_id = user.id,只要关联存在,$user->id必然等于$user->detail_data->users_id,原判断条件完全多余,直接判断关联是否存在即可。
方案2:控制器提前拦截无关联数据的情况(可选)
如果业务要求用户必须先完善基础信息才能进入编辑页,可在控制器中提前检查并处理:
public function editData88(Request $request, $id) { $id = Auth::user()->id; $user = User::where('id', $id)->with(['detail_data' => function ($query) { $query->with('agama'); }])->first(); // 无关联数据则跳转回原页面并提示 if (!$user->detail_data) { return redirect()->back()->with('error', '请先完善个人基础信息'); } $data_agama = Agama88::all(); return view('crud.edit88', compact('user', 'data_agama', 'id')); }
方案3:使用PHP可选链简化判断(PHP 8.0+)
若项目使用PHP 8.0及以上版本,可通过可选链操作符避免空错误:
<div class="form-group"> <label for="exampleInputPassword1">Alamat</label> <input type="text" class="form-control" id="alamat" name="alamat" value="{{ $user->detail_data?->alamat ?? '' }}" placeholder="{{ $user->detail_data ? '' : 'Masukkan Alamat' }}"> </div>
说明:$user->detail_data?->alamat会在detail_data为null时返回null,再通过?? ''替换为空字符串,避免视图报错。
额外优化建议
- 控制器中
$id = Auth::user()->id;已覆盖路由参数$id,若该路由参数无实际用途,可删除以避免混淆。 - 模型关联方法建议遵循Laravel驼峰命名规范,将
detail_data改为detailData,对应视图中使用$user->detailData,更符合框架惯例。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

