Laravel 8中如何正确链式调用Eloquent的having子句?
解决Laravel 8中Livewire表格过滤的Having子句问题
问题出在两个核心点:一是SQL里判断NULL不能用=,必须用IS NULL;二是直接链式orHaving可能和其他条件逻辑冲突,需要把两个条件分组处理。
正确写法一:使用havingRaw直接编写SQL片段
这种方式最直接,同时用参数绑定避免SQL注入风险:
->havingRaw('statistics_products_sum_? < 20000 OR statistics_products_sum_? IS NULL', [$this->year, $this->year])
正确写法二:用闭包分组处理条件
如果需要和其他having条件配合,用闭包把这两个条件包裹起来,确保逻辑独立不混乱:
->having(function ($query) { $column = 'statistics_products_sum_' . $this->year; $query->having($column, '<', 20000) ->orHavingRaw("$column IS NULL"); })
原写法失效的原因
- SQL语法限制:
NULL是特殊值,无法通过= NULL匹配,必须用IS NULL关键字才能识别。 - 逻辑分组问题:直接链式
orHaving会让该条件和之前所有having条件形成全局OR关系,可能打乱原有筛选逻辑,用闭包分组能保证这两个条件是一组独立的OR判断。
另外要确认statistics_products_sum_'.$this->year是withSum生成的正确别名,比如年份为2024时,字段名应为statistics_products_sum_2024,避免拼写错误导致字段不存在。
内容的提问来源于stack exchange,提问作者Petitemo
相关产品推荐
相关产品推荐

