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
相关产品推荐
相关产品推荐

