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

Laravel 5.5按is_reviewed值动态切换查询表的实现问题

问题分析与修复方案

嘿,我来帮你捋清楚为什么你的if else逻辑没生效,以及怎么搞定它!

核心问题:你拿到的不是单个值,是集合!

先看你获取$isReviewed的这段代码:

$isReviewed = ProjectUser::where('user_id', Auth::user()->id)->select(DB::raw('(CASE WHEN is_reviewed = 0 THEN "0" ELSE "1" END)'))->get();

这里的get()方法返回的是Eloquent集合对象,不是你想要的单个'0'或'1'字符串。你直接拿集合和字符串比较,当然永远匹配不上,这就是逻辑失效的根源。

一步一步修正

1. 正确获取单个is_reviewed值

你需要拿到当前用户对应的is_reviewed的单个值,推荐用value()方法直接取出字段值,简单高效:

// 直接获取用户对应的is_reviewed字段值,返回0或1(取决于数据库字段类型)
$isReviewed = ProjectUser::where('user_id', Auth::user()->id)->value('is_reviewed');

不需要用CASE语句绕一圈,因为原字段本身就是0/1,直接取就行。如果担心用户没有对应的ProjectUser记录,可以先判断是否为空:

$isReviewed = ProjectUser::where('user_id', Auth::user()->id)->value('is_reviewed');

// 处理用户无对应记录的情况,避免后续逻辑报错
if (is_null($isReviewed)) {
    $datas = collect(); // 返回空集合
    // 或者根据业务需求做其他处理,比如跳转到提示页
}

2. 修正分支查询逻辑

现在$isReviewed是正确的单个值了,就能正常执行分支逻辑。另外给你的查询提两个小建议:

  • whereNotIn('is_reviewed', [1])可以直接写成where('is_reviewed', 0),更直观;
  • 关联查询时,把where('projects.status', 2)放在join之后,逻辑更清晰(不过你的写法本身没问题)。

修正后的完整代码:

$isReviewed = ProjectUser::where('user_id', Auth::user()->id)->value('is_reviewed');

if (is_null($isReviewed)) {
    $datas = collect();
} else {
    if ($isReviewed == 0) { // 这里用整数还是字符串,取决于你数据库字段的类型,建议用整数
        $datas = ProjectUser::where('user_id', Auth::user()->id)
            ->join('users', 'users.id', '=', 'project_users.user_id')
            ->join('projects', 'projects.id', '=', 'project_users.project_id')
            ->join('websites_list', 'websites_list.id', '=', 'projects.id_website')
            ->where('projects.status', 2)
            ->where('is_reviewed', 0)
            ->select('projects.*', 'websites_list.url_web', 'users.name', 'project_users.user_id')
            ->get();
    } else {
        $datas = ReviewProjectUser::where('reviewer_user_id', Auth::user()->id)
            ->join('users', 'users.id', '=', 'review_project_users.reviewer_user_id')
            ->join('projects', 'projects.id', '=', 'review_project_users.project_uid')
            ->join('websites_list', 'websites_list.id', '=', 'projects.id_website')
            ->where('projects.status', 2)
            ->select('projects.*', 'websites_list.url_web', 'users.name', 'review_project_users.reviewer_user_id')
            ->get();
    }
}

额外优化:代码复用

如果这段查询逻辑会在多个地方用到,建议把它封装成模型的静态方法,让代码更整洁。比如在ProjectUser模型里加个方法:

public static function getUnreviewedUserProjects($userId)
{
    return self::where('user_id', $userId)
        ->join('users', 'users.id', '=', 'project_users.user_id')
        ->join('projects', 'projects.id', '=', 'project_users.project_id')
        ->join('websites_list', 'websites_list.id', '=', 'projects.id_website')
        ->where('projects.status', 2)
        ->where('is_reviewed', 0)
        ->select('projects.*', 'websites_list.url_web', 'users.name', 'project_users.user_id')
        ->get();
}

然后在ReviewProjectUser模型里也写类似的getReviewedUserProjects方法,这样控制器里的代码就会简化成:

$isReviewed = ProjectUser::where('user_id', Auth::user()->id)->value('is_reviewed');

if (is_null($isReviewed)) {
    $datas = collect();
} else {
    $datas = $isReviewed == 0 
        ? ProjectUser::getUnreviewedUserProjects(Auth::user()->id)
        : ReviewProjectUser::getReviewedUserProjects(Auth::user()->id);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:30:38