Laravel中使用Criteria查询转换单位后的价格无返回结果是什么原因?
问题排查与解决方法
首先明确问题核心:相同查询条件直接调用模型可返回结果,使用prettus/l5-repository的Criteria查询无结果,可按照以下顺序排查:
排查步骤
1. 优先清除已有Criteria避免条件叠加
Repository默认会保留之前添加的所有Criteria条件,若之前有其他查询条件未清除,会和当前价格筛选条件叠加导致无匹配结果。调用前先重置Criteria:
// 先转成int避免浮点精度问题 $cents = [(int)($request->price * 100)]; // 清除之前所有Criteria $this->repository->resetCriteria(); $this->repository->pushCriteria(new WhereInCriteria('price', $cents)); $result = $this->repository->paginate();
2. 修正价格转换的精度问题
用户输入的美元价格为浮点型,直接乘100可能出现浮点精度误差(比如0.1*100实际得到10.0000000001),如果数据库price字段为int类型,浮点值和int值匹配会失败。转换时强制转int即可解决。
3. 验证Repository绑定的模型是否正确
检查你当前使用的Repository类的$model属性,确认绑定的是Book::class,如果绑定到其他模型自然查询不到结果。
4. 对比生成的SQL定位差异
如果以上步骤都无法解决,打印两个查询的SQL语句直接对比差异:
// 打印直接调用模型的SQL dd(Book::whereIn('price',$cents)->toSql(), Book::whereIn('price',$cents)->getBindings()); // 打印Repository生成的SQL $this->repository->resetCriteria(); $this->repository->pushCriteria(new WhereInCriteria('price', $cents)); dd($this->repository->getQuery()->toSql(), $this->repository->getQuery()->getBindings());
两者的查询字段、绑定参数、额外where条件的差异就是问题所在。
内容的提问来源于stack exchange,提问作者user17426459
相关产品推荐
相关产品推荐

