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

Laravel中无法在where子句使用selectRaw定义的字段别名问题

问题原因

这是SQL本身的语法执行顺序导致的问题,和Laravel查询构造器无关。SQL的执行优先级为 FROM > JOIN > WHERE > GROUP BY > 聚合函数计算 > HAVING > SELECT > ORDER BY > LIMIT,你通过sum(quantity) as quantity_sum定义的别名,是GROUP BY之后聚合计算阶段才生成的,而WHERE执行阶段远早于聚合计算,此时quantity_sum还不存在,所以会报字段不存在的错误。

解决方法

聚合结果的过滤需要使用HAVING子句,你只需要把原来针对quantity_sum的where调用换成Laravel提供的having方法即可。

修正后的代码如下:

$rafbul = Inventory::selectRaw('*, sum(quantity) as quantity_sum')
    ->join('shelves', function($q){
        $q->on('shelves.id', 'inventories.shelf_id');
        $q->where('type', '!=', 'stock');
    })
    ->where('product_id', $product_id)
    ->having('quantity_sum', '>', 0) // 替换原where方法为having
    ->groupBy('shelf_id')
    ->orderBy('inventories.created_at')
    ->first();

补充注意:如果你的数据库开启了ONLY_FULL_GROUP_BY模式,需要把selectRaw里所有非聚合的字段都加到groupBy参数中,避免后续出现其他SQL语法报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:18:02