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
相关产品推荐
相关产品推荐

