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

Laravel开发用户排班历史时出现Trying to get property 'users' of non-object报错求解

报错原因排查
    1. 部分Eventos记录的solicitud_id为空,或者对应的Solicitudes记录已被删除,导致$evento->solicitud返回null,后续访问null的属性直接抛出错误
    1. Solicitudes模型未定义与用户表的关联方法,即使solicitud不为空,调用不存在的users属性也会报错
    1. 全量查询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 17:45:03