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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:36:02