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

Laravel项目本地正常,云端部署后Dashboard控制器功能异常求助

Laravel项目云端部署后Dashboard筛选数据为空的排查与修复

核心问题定位

本地XAMPP环境正常,云端部署后返回空列表,本质是环境差异、数据匹配问题或代码潜在未捕获异常导致筛选逻辑失效,以下是具体排查和修复方案:


1. 服务器时区不匹配(最常见)

代码中使用Carbon::now()做截止时间筛选,如果云端服务器时区和本地不一致,会导致deadline > Carbon::now()的条件误判(比如本地是UTC+8,云端是UTC,本地的"今天"在云端会被识别为"昨天")。

  • 修复:在项目根目录的.env文件中指定时区:
    APP_TIMEZONE=Asia/Shanghai
    
    或者在代码中明确指定时区:
    Carbon::now('Asia/Shanghai')
    

2. 分类查询空值未处理(隐性报错)

原代码中$scholarshipCategories->first()->id如果查询不到对应分类,会直接抛出错误,但生产环境默认隐藏错误,最终返回空列表。

  • 修复:添加空值判断,避免强制调用->id:
    $scholarshipCategory = ScholarshipCategory::query()
        ->where('name', $userCategoryName)
        ->first();
    
    if (!$scholarshipCategory) {
        // 分类不存在时返回空集合,或自行处理默认逻辑
        $scholarships = collect();
    } else {
        // 原有的Scholarship查询逻辑
        $scholarships = Scholarship::query()
            ->where('deadline', '>', Carbon::now())
            ->where('published', 1)
            ->whereHas('category', function ($query) use ($scholarshipCategory) {
                $query->where('id', $scholarshipCategory->id);
            })
            ->get();
    }
    

3. 用户元数据与分类名称不匹配

云端数据库的UserMetaData.category值可能和ScholarshipCategory.name存在大小写、空格或拼写差异(本地数据正确,但云端导入时出错)。

  • 排查:执行SQL验证匹配情况:
    SELECT um.category, sc.name 
    FROM user_meta_data um
    LEFT JOIN scholarship_categories sc ON um.category = sc.name
    WHERE um.user_id = [当前登录用户ID];
    
  • 修复:如果是大小写问题,修改查询忽略大小写:
    $scholarshipCategory = ScholarshipCategory::query()
        ->whereRaw('LOWER(name) = LOWER(?)', [$userCategoryName])
        ->first();
    

4. 模型关联关系错误

确保Scholarship模型中的category关联定义正确,若外键不是默认的category_id,需手动指定:

// Scholarship模型中
public function category()
{
    // 若外键是自定义字段,比如scholarship_category_id,需补充第二个参数
    return $this->belongsTo(ScholarshipCategory::class);
}

5. 临时开启调试模式查错

在云端临时开启调试模式(仅限排查阶段),修改.env:

APP_DEBUG=true

访问Dashboard页面,直接查看具体报错(比如数据库权限、字段不存在等)。

6. 验证云端数据状态

检查云端数据库中Scholarship和Job的published字段值是否为1,确认deadline字段是否符合筛选条件。


优化后的完整代码示例

public function index(Request $request)
{
    $user = auth()->user();

    if ($user->is_job) {
        $programs = Job::where('published', 1)->get();
        $programs = DashboardHelper::multipleJobResults($programs, $user->id);
    } else {
        if ($user->is_admin) {
            $scholarships = Scholarship::query()
                ->where('deadline', '>', Carbon::now())
                ->where('published', 1)
                ->get();
        } else {
            $metadata = UserMetaData::where('user_id', $user->id)->first();
            $userCategoryName = $metadata ? $metadata->category : config('app.user_default_category', 'ScienceEngineering');

            // 兼容大小写的分类查询
            $scholarshipCategory = ScholarshipCategory::query()
                ->whereRaw('LOWER(name) = LOWER(?)', [$userCategoryName])
                ->first();

            if (!$scholarshipCategory) {
                $scholarships = collect();
            } else {
                $scholarships = Scholarship::query()
                    ->where('deadline', '>', Carbon::now())
                    ->where('published', 1)
                    ->whereHas('category', function ($query) use ($scholarshipCategory) {
                        $query->where('id', $scholarshipCategory->id);
                    })
                    ->get();
            }
        }
        $scholarships = $scholarships->sortBy('name');

        $programs = DashboardHelper::multipleResults($scholarships, $user->id);
    }

    return view('user.dashboard.dashboard', compact('programs'));
}

内容的提问来源于stack exchange,提问作者Anthony Badebye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:33:22