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();
关键修改点
- 表连接处理:用
DB::raw()包裹from()的参数,手动给transactions添加反引号,避免框架错误地将反引号应用到子查询部分。 - 简化
selectRaw:Laravel 10中selectRaw支持直接传入原生SQL字符串,无需额外调用DB::raw()->getValue(),减少冗余代码。 - SQL结构优化:去掉嵌套的
SELECT语句,直接使用COALESCE(SUM(...), 0)简化逻辑,同时保证功能不变。
内容的提问来源于stack exchange,提问作者stanbojev
相关产品推荐
相关产品推荐

