如何使用Laravel查询构建器实现带CASE条件的JOIN关联查询
Laravel Query Builder 转换方案
方法1:原生逻辑对齐实现(可读性最高)
直接用DB::raw封装CASE语句,和你提供的原生SQL逻辑完全一致:
$query = DB::table('table_1') ->join('table_2', 'table_1.id', '=', 'table_2.id') ->join('table_3', DB::raw(' CASE WHEN {some condition} THEN table_1.id ELSE table_2.id END '), '=', 'table_3.id') ->get();
将代码中的{some condition}替换为实际业务条件即可,比如table_1.is_valid = 1这类合法SQL表达式。
方法2:安全参数绑定实现(避免SQL注入)
如果判断条件包含外部传入的动态参数,使用参数绑定保证查询安全:
// 示例动态条件:table_1.status = 用户传入的状态值 $inputStatus = request('status'); // 外部传入变量示例 $query = DB::table('table_1') ->join('table_2', 'table_1.id', '=', 'table_2.id') ->join('table_3', DB::raw(' CASE WHEN table_1.status = ? THEN table_1.id ELSE table_2.id END '), '=', DB::raw('table_3.id')) ->addBinding($inputStatus, 'join') ->get();
若使用Eloquent模型查询,仅需将开头的
DB::table('table_1')替换为对应模型的YourModel::query(),后续join逻辑完全通用。
内容的提问来源于stack exchange,提问作者Mark Adel
相关产品推荐
相关产品推荐

