Laravel查询构建器循环中from方法无法堆叠的问题求助
解决Laravel查询构建器
from()方法循环覆盖的问题 你遇到的问题是因为每次调用->from()都会替换当前查询的FROM子句,而非追加内容,所以循环结束后只会保留最后一次的结果。要在FROM子句中包含多个SELECT子查询,需要先把所有子查询拼接完成,再一次性传入from()方法。
修改后的代码示例:
$subQueries = []; $day = 0; // 根据你的业务逻辑调整初始值 for ($j = 0; $j < 31; $j++) { $dateFormat = $hariSama[$j]; // 构建单个子查询,确保别名唯一 $subQueries[] = "(SELECT SUM(CASE WHEN tgl IN ($dateFormat) THEN score END) AS day_$day)"; array_push($count, strval($day)); $day++; } // 将所有子查询拼接后一次性传入from() $scoreboard->from(DB::raw(implode(', ', $subQueries)));
关键说明:
- 先收集子查询:循环中把每个需要的SELECT语句存入数组,而非直接调用
from(),避免每次替换原有内容。 - 一次性设置FROM:用
implode(', ', $subQueries)把所有子查询拼接成一个字符串,再通过DB::raw()传入from(),这样FROM子句就会包含所有31个SELECT子查询。 - SQL安全提醒:如果
$hariSama[$j]包含用户输入内容,必须做好转义或参数绑定,避免SQL注入风险。比如处理日期数组时:// 假设$hariSama[$j]是日期数组,如['2024-01-01', '2024-01-02'] $safeDates = implode("', '", array_map(function($date) { return DB::getPdo()->quote($date); }, $hariSama[$j])); $subQueries[] = "(SELECT SUM(CASE WHEN tgl IN ('$safeDates') THEN score END) AS day_$day)";
内容的提问来源于stack exchange,提问作者Retaker
相关产品推荐
相关产品推荐

