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

Laravel 10原生查询反引号位置错误问题求助

Laravel 10升级:原生查询反引号位置错误修复

问题背景

升级Laravel 10版本后,项目中使用DB::raw()的余额计算原生查询出现SQL语法错误,核心问题是框架错误地将反引号应用到了子查询部分,而非仅包裹transactions表名。

错误原因

Laravel 10对原生表达式的处理逻辑发生变更,直接在from()方法中拼接transactions, (SELECT @balance := 0) AS variableInit时,框架会自动为整个字符串添加错误的反引号包裹,导致SQL语法失效。

修正方案

通过DB::raw()手动处理from()中的表连接语句,明确指定transactions表的反引号,同时简化selectRaw的写法适配Laravel 10的语法:

$query = Transaction::query();
$query
    ->where(['funds_account_id' => $fundsAccount->id])
    ->withSum(['transactionItems as incR' => function ($query) {
        $query->whereNotNull('completed_at');
        $query->where('void', 0);
    }], 'increase_amt')
    ->withSum(['transactionItems as decR' => function ($query) {
        $query->where('void', 0);
    }], 'decrease_amt')
    ->selectRaw('@balance := @balance + COALESCE(SUM(incR - decR), 0) AS theBalance')
    ->from(DB::raw('`transactions`, (SELECT @balance := 0) AS variableInit'))
    ->with(['user', 'Type'])
    ->whereNotNull('completed_at')
    ->orderBy('completed_at');

$results = $query->get();

关键修改点

  1. 表连接处理:用DB::raw()包裹from()的参数,手动给transactions添加反引号,避免框架错误地将反引号应用到子查询部分。
  2. 简化selectRaw:Laravel 10中selectRaw支持直接传入原生SQL字符串,无需额外调用DB::raw()->getValue(),减少冗余代码。
  3. SQL结构优化:去掉嵌套的SELECT语句,直接使用COALESCE(SUM(...), 0)简化逻辑,同时保证功能不变。

内容的提问来源于stack exchange,提问作者stanbojev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 20:20:03