Laravel 9中如何为DB::raw内的子查询绑定动态参数?
解决Laravel 9查询构建器子查询动态参数绑定问题
方案一:使用查询构建器构建子查询(推荐)
避免直接用DB::raw写整个子查询字符串,改用Laravel的查询构建器生成子查询,这样能自动安全绑定$searchDate参数,代码更易维护:
// 先定义子查询逻辑 $latestSalarySubquery = DB::table('employees_salaries') ->select('employee_id', DB::raw('MAX(effective_from) as MaxDate')) ->where('effective_from', '<=', $searchDate) ->groupBy('employee_id'); // 主查询关联子查询 $employees = DB::table('employees') ->join('employees_salaries', 'employees_salaries.employee_id', '=', 'employees.id') ->joinSub($latestSalarySubquery, 'innerTable', function ($join) { $join->on('employees_salaries.employee_id', '=', 'innerTable.employee_id') ->on('employees_salaries.effective_from', '=', 'innerTable.MaxDate'); }) ->select( 'employees.id as employee_id', 'employees_salaries.*', DB::raw("CONCAT(first_name, ' ', second_name, ' ', third_name) as fullname") ) ->get();
方案二:手动给DB::raw绑定参数
如果坚持用原生子查询字符串,可以通过DB::raw的第二个参数传递绑定值,用?作为占位符:
$employees = DB::table('employees') ->join('employees_salaries', 'employees_salaries.employee_id', '=', 'employees.id') ->join( DB::raw('(SELECT employee_id, MAX(effective_from) as MaxDate FROM employees_salaries WHERE effective_from <= ? GROUP BY employee_id) innerTable'), function ($join) { $join->on('employees_salaries.employee_id', '=', 'innerTable.employee_id') ->on('employees_salaries.effective_from', '=', 'innerTable.MaxDate'); }, [$searchDate] // 这里传入绑定的参数值 ) ->select( 'employees.id as employee_id', 'employees_salaries.*', DB::raw("CONCAT(first_name, ' ', second_name, ' ', third_name) as fullname") ) ->get();
方案一完全利用Laravel查询构建器的特性,代码可读性更高,还能自动处理参数绑定,避免SQL注入,是更优的选择。
内容的提问来源于stack exchange,提问作者Virell
相关产品推荐
相关产品推荐

