Laravel使用from/to价格区间参数筛选产品时出现非对象属性调用错误如何解决
问题原因
- 核心报错原因:Laravel 查询构造器的
when()方法回调接收的第二个参数,是when()第一个判断条件的返回值,也就是你代码里$filters['from']的实际值(通常为数字/字符串类型,不是请求对象)。你误把它当成 Request 对象调用->to属性,因此抛出「Trying to get property 'to' of non-object」错误。 - 逻辑缺陷:当前仅判断了
from参数存在的情况,没有兼容to参数单独存在的场景,且没有校验to参数是否存在就直接调用。 - 表单参数丢失原因:打印请求仅能拿到
from值,需检查视图表单中最高价对应的输入框name属性是否为to,是否存在拼写错误、属性禁用、表单提交范围错误等问题。
修复方案
修改模型中的 scopeFilter 方法即可,控制器代码无需调整:
public function scopeFilter($query, array $filters) { // 筛选最低价 $query->when( $filters['from'] ?? false, function ($query, $fromPrice) use ($filters) { // 同时存在最高价时用区间筛选 if (isset($filters['to'])) { return $query->whereBetween('price', [$fromPrice, $filters['to']]); } // 仅存在最低价时筛选大于等于该值 return $query->where('price', '>=', $fromPrice); } ); // 单独筛选最高价(适配用户只填最高价的场景) $query->when( $filters['to'] ?? false, function ($query, $toPrice) use ($filters) { if (!isset($filters['from'])) { return $query->where('price', '<=', $toPrice); } } ); // 原有分类筛选逻辑可在此处继续扩展 }
如果业务要求必须同时传入价格上下限才触发筛选,可以简化为如下写法:
public function scopeFilter($query, array $filters) { $query->when( isset($filters['from'], $filters['to']), function ($query) use ($filters) { return $query->whereBetween('price', [$filters['from'], $filters['to']]); } ); }
最后检查视图表单的最高价输入框,确保属性为 <input type="number" name="to"> 即可正常获取 to 参数。
内容的提问来源于stack exchange,提问作者Omar Malas
相关产品推荐
相关产品推荐

