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

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)));

关键说明:

  1. 先收集子查询:循环中把每个需要的SELECT语句存入数组,而非直接调用from(),避免每次替换原有内容。
  2. 一次性设置FROM:用implode(', ', $subQueries)把所有子查询拼接成一个字符串,再通过DB::raw()传入from(),这样FROM子句就会包含所有31个SELECT子查询。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:00:28