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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:00:04