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
相关产品推荐
相关产品推荐

