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

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");
})

原写法失效的原因

  1. SQL语法限制:NULL是特殊值,无法通过= NULL匹配,必须用IS NULL关键字才能识别。
  2. 逻辑分组问题:直接链式orHaving会让该条件和之前所有having条件形成全局OR关系,可能打乱原有筛选逻辑,用闭包分组能保证这两个条件是一组独立的OR判断。

另外要确认statistics_products_sum_'.$this->year是withSum生成的正确别名,比如年份为2024时,字段名应为statistics_products_sum_2024,避免拼写错误导致字段不存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:10:31