Laravel Eloquent如何查询decimal类型字段不等于0的数据
Laravel产品查询逻辑修复方案
原代码问题说明
你当前使用的orWhereRaw('srp != FLOOR(0.00)')写法存在两个问题:
- 逻辑冗余:
FLOOR(0.00)的计算结果固定为0,这段SQL本质是判断srp != 0,完全不需要调用FLOOR函数 - 不必要的Raw查询:无动态参数传入的场景下使用Raw写法,会降低代码的数据库兼容性,徒增维护成本
正确实现方案
方案1:原生查询写法(推荐)
直接使用Laravel查询构建器的原生where方法即可,框架会自动适配decimal字段类型,可正确识别0.00、0.0等所有精度的0值,替换代码如下:
->orWhere('srp', '!=', 0)
方案2:Raw查询写法(特殊场景使用)
如果业务确实需要使用Raw写法,建议搭配参数绑定避免潜在的SQL注入风险,写法如下:
->orWhereRaw('srp <> ?', [0])
特殊场景补充
如果你的实际需求是筛选srp为非整数的带小数数值(排除所有整数价格,仅保留带小数位的价格),才需要用到FLOOR函数,对应写法为:
->orWhereRaw('srp != FLOOR(srp)')
修复后完整代码
public function render() { $searchTerm = '%' . $this->searchTerm . '%'; $products = Product::where(function($query) use ($searchTerm) { return $query->where('code', 'like', $searchTerm) ->orWhere('name', 'like', $searchTerm) ->orWhere('description', 'like', $searchTerm); }) ->where(function($query) { return $query->where('qty_on_hand', '!=', 0) ->orWhere('srp', '!=', 0); }) ->orderBy('name') ->paginate($this->amount); $this->emit('productStore'); return view('livewire.load-in-stock-products', ['products' => $products]); }
内容的提问来源于stack exchange,提问作者Jumar Juaton
相关产品推荐
相关产品推荐

