Livewire添加与搜索无关orWhere不影响搜索及浮点字段条件生效问题
问题原因
你遇到的两个问题分别是SQL逻辑优先级错误、浮点类型精度判断规则的问题,修复方案如下:
1. 搜索失效问题
你原写法中orWhere('qty_on_hand', '!=', 0)和前面的三个搜索条件平级,生成的SQL逻辑为:
WHERE code like ? OR name like ? OR description like ? OR qty_on_hand !=0
只要商品库存不为0,哪怕完全不匹配搜索词也会被查询出来,自然导致搜索功能失效。你需要把搜索条件用闭包包裹成分组,让过滤条件(库存、SRP不为0)和搜索条件是AND的关系,即所有返回的商品必须同时满足「库存/SRP符合要求」和「匹配搜索词」两个规则。
2. 浮点类型srp字段判断失效问题
float是近似精度存储的数值类型,直接用!= 0.00判断会因为精度误差(比如实际存储的是0.0000000001或者-0.0000000001)导致判断失效,需要用绝对值差值小于极小值的方式判断是否等于0。
修复后完整代码
public function render() { $searchTerm = '%' . $this->searchTerm . '%'; $products = Product::orderBy('name') // 外层是必须满足的全局过滤条件 ->where('qty_on_hand', '!=', 0) // 浮点类型判断:绝对值大于0.0001就视为不等于0,符合业务要求 ->whereRaw('ABS(srp) > 0.0001') // 搜索条件分组,和外层过滤条件是AND关系 ->where(function($query) use ($searchTerm) { $query->where('code', 'like', $searchTerm) ->orWhere('name', 'like', $searchTerm) ->orWhere('description', 'like', $searchTerm); }) ->paginate($this->amount); $this->emit('productStore'); return view('livewire.load-in-stock-products', ['products' => $products]); }
如果你的业务逻辑是「匹配搜索词 或者 库存不为0」,只需要调整条件的嵌套关系即可,当前修复是按照常规场景「仅在有库存、SRP不为0的商品中执行搜索」的需求实现的。
内容的提问来源于stack exchange,提问作者Jumar Juaton
相关产品推荐
相关产品推荐

