Laravel开发用户排班历史时出现Trying to get property 'users' of non-object报错求解
报错原因排查
- 部分
Eventos记录的solicitud_id为空,或者对应的Solicitudes记录已被删除,导致$evento->solicitud返回null,后续访问null的属性直接抛出错误
- 部分
Solicitudes模型未定义与用户表的关联方法,即使solicitud不为空,调用不存在的users属性也会报错
- 全量查询
Eventos::All()后在视图层做过滤的实现方式不合理,会产生不必要的性能开销,也放大了空关联的异常风险
- 全量查询
解决方案
第一步:修正模型关联
先给Solicitudes模型新增和用户表的关联,注意匹配你表中User_id的字段名:
// Solicitudes模型新增代码 public function user() { // 第二个参数指定你表中实际的用户外键字段名 return $this->belongsTo(User::class, 'User_id'); }
额外提示:你当前
Solicitudes模型定义的evento关联是belongsTo,不符合Eventos.solicitud_id关联Solicitudes.id的逻辑,反向关联应该定义为hasOne/hasMany,如果没用到这个反向关联暂时不影响本次功能,后续有需求可以修正:public function evento() { return $this->hasOne(Eventos::class); }
第二步:优化控制器查询逻辑
直接在查询层过滤当前用户的排班数据,避免全量查询和视图层判断,同时预加载关联解决N+1查询问题:
public function perfil (){ $eventos = Eventos::with(['solicitud', 'servicio']) ->whereHas('solicitud', function($query) { // 直接通过关联条件筛选当前用户的记录 $query->where('User_id', Auth::id()); }) ->get(); $data = [ 'category_name' => 'users', 'page_name' => 'profile', 'has_scrollspy' => 0, 'scrollspy_offset' => '', ]; return view('users.user_profile',compact('eventos'))->with($data); }
第三步:简化视图层代码
查询结果已经是当前用户的记录,无需额外判断,可直接遍历,用空安全运算符兜底避免偶发的空关联报错:
@foreach($eventos as $evento) <div class="item-timeline"> <div class="t-meta-date"> <p class="">{{$evento->fecha}}</p> </div> <div class="t-dot"> </div> <div class="t-text"> <p>{{$evento?->servicio?->servicio}}</p> <p>{{$evento->personal}}</p> </div> </div> @endforeach
如果不想修改原有逻辑仅临时解决报错,可在视图层的判断里先校验关联是否存在:
@if($evento->solicitud && $evento->solicitud->User_id == Auth::user()->id)
内容的提问来源于stack exchange,提问作者seonica
相关产品推荐
相关产品推荐

