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

Laravel 5中loans与paid_loans两张关联表的子查询实现问题

问题原因排查

你写的代码有两个核心错误:

  • 比较运算符写反:需求是匹配loanAmount大于已还款总金额的记录,你用了<=
  • 子查询未关联外层表:PaidLoan::where(...)->get()->sum()会立即执行独立的SQL查询,此时loans.id会被当成普通字符串值匹配,而非关联外层loans表的id字段,同时先查询全量集合再求和的写法性能极低。

正确实现方式

方式1:直接复用原生SQL(最稳妥,适配所有Laravel 5版本)

Loan::whereRaw('loanAmount > (SELECT IFNULL(SUM(paidLoanAmount), 0) FROM paid_loans WHERE loanId = loans.id)')->get();

方式2:查询构建器原生写法(无需拼接SQL字符串)

Loan::where('loanAmount', '>', function ($subQuery) {
    $subQuery->from('paid_loans')
        ->selectRaw('IFNULL(SUM(paidLoanAmount), 0)')
        // 用whereColumn做字段关联,避免把loans.id解析为字符串值
        ->whereColumn('paid_loans.loanId', 'loans.id');
})->get();

优化建议

建议给paid_loans表的loanId字段添加普通索引,可以大幅提升子查询的求和效率。

内容的提问来源于stack exchange,提问作者Aizo Kini Isaac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:48:05