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

基于全局作用域过滤用户数据时遇500错误求助

用户表全局作用域过滤导致500错误排查与解决

1. 优先排查递归查询问题

这是最常见的触发原因:当你在User模型的全局作用域中调用auth()->user()时,该方法会再次查询User模型,而查询又会触发全局作用域,形成无限递归,直接导致内存溢出或超时,最终返回500错误。

解决方法:查询当前用户时临时关闭全局作用域:

// 方式1:关闭所有全局作用域
$user = User::withoutGlobalScopes()->find(auth()->id());

// 方式2:仅关闭当前作用域(推荐)
$user = User::withoutGlobalScope(YourScopeClass::class)->find(auth()->id());

2. 增加空值与字段有效性校验

500错误也可能来自未登录场景(auth()->user()返回null),或者用户模型缺少role_id/company_id/hq_code字段,调用属性时触发致命错误。

修改作用域代码,添加校验逻辑:

public function apply(Builder $builder, Model $model)
{
    $user = auth()->user();
    // 未登录直接返回空结果
    if (!$user) {
        $builder->whereRaw('1=0');
        return;
    }

    $builder->when($user->role_id > 4 && $user->company_id, function ($query) use ($user) {
        $query->where('id', $user->company_id);
    });

    $builder->when($user->role_id == 4 && $user->hq_code, function ($query) use ($user) {
        $query->where('hq_code', $user->hq_code);
    });
}

3. 优化数据库查询性能

卡顿大概率是因为过滤条件未命中索引,导致全表扫描。

  • 检查users表的hq_code字段是否添加索引,数据量较大时必须加索引:
    ALTER TABLE users ADD INDEX idx_hq_code (hq_code);
    
  • 开启查询日志分析SQL执行情况:
    DB::enableQueryLog();
    // 执行触发过滤的查询
    dd(DB::getQueryLog());
    

4. 查看错误日志定位细节

直接查看Laravel日志文件storage/logs/laravel.log,里面会有完整的错误栈信息,比如内存溢出、SQL语法错误、字段不存在等,能精准定位问题根源。

内容的提问来源于stack exchange,提问作者Bongani Napoleon Dlamini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:39:54