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

Laravel中scopeFilter查询报Undefined variable '$category'错误如何解决

问题原因

该报错是PHP匿名函数的作用域继承规则导致的:你传给when方法的回调函数接收的$category参数,只能在该回调的直接作用域内使用。你在该回调内部嵌套了一层传给whereExists的匿名函数,嵌套的函数默认无法访问上层作用域的变量,因此会报$category未定义。

修复方案

给内层匿名函数通过use关键字导入需要的$category变量即可,修改后代码如下:

public function scopeFilter($query, array $filters)
{
    $query->when($filters['search'] ?? false, function ($query, $search) {
        $query->where('title', 'like', '%' . $search . '%')->orWhere('body', 'like', '%' . $search . '%');
    });

    $query->when(
        $filters['category'] ?? false,
        function ($query, $category) {
            $query
                ->whereExists(
                    function ($query) use ($category) {
                        $query->from('categories')
                            ->whereColumn('categories.id', 'posts.category_id')
                            ->where('categories.slug', $category);
                    }
                );
        }
    );
}

可选优化

如果你的运行环境PHP版本≥8.0,可以使用箭头函数简化写法,无需手动通过use导入上层作用域变量:

// 替换内层的whereExists回调为箭头函数
->whereExists(
    fn($query) => $query->from('categories')
        ->whereColumn('categories.id', 'posts.category_id')
        ->where('categories.slug', $category)
);

内容的提问来源于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 21:36:02