Laravel 8报错:Array callback must have exactly two elements 求助
问题解决:Laravel 8 "Array callback must have exactly two elements" 错误
错误根源
你的代码存在两个核心问题:
- 数组取值语法错误:误将数组
$filters当作函数调用,使用了$filters('search'),正确的数组取值方式应为$filters['search']。 - 查询作用域命名不规范:Laravel的查询作用域方法必须以
scope开头,否则框架会错误地将其解析为回调数组,触发"Array callback must have exactly two elements"错误。
修正后的代码
模型代码(Post.php)
// 方法名必须以scope开头,定义为查询作用域 public function scopeFilter($query, $filters) { // 简洁判断search参数是否存在且非空 if ($search = $filters['search'] ?? false) { $query->where('title', 'like', '%' . $search . '%') ->orWhere('body', 'like', '%' . $search . '%'); } }
注:原代码中的
tittle是拼写错误,应改为title,避免后续出现字段不存在的异常。
控制器代码
"posts" => Post::latest()->filter(request(['search']))->get()
这段代码逻辑正确,无需修改。
额外说明
- Laravel查询作用域用于封装可复用的查询逻辑,方法名必须遵循
scopeXXX的命名规则,调用时只需写XXX(...)(例如这里的filter(...)对应scopeFilter)。 - 使用
$filters['search'] ?? false是PHP 7+的空合并运算符,相比isset写法更简洁安全,可同时判断键是否存在且值不为空。
内容的提问来源于stack exchange,提问作者Tommy Ferdian Hadimarta
相关产品推荐
相关产品推荐

