Laravel:在急切加载中将类函数作为回调传递?

Ada*_*dam 4 php laravel

我将约束急切加载与匿名函数一起使用:

$users = App\User::with(['posts' => function ($query) {
    $query->where('title', 'like', '%first%');
}])->get();
Run Code Online (Sandbox Code Playgroud)

现在我想用类函数替换匿名函数。根据PHP:我发现如何使用类函数作为回调

实例化对象的方法作为数组传递,该数组包含索引 0 处的对象和索引 1 处的方法名称。

因此我预计以下内容会起作用:

public function start()
{
   $users = App\User::with(['posts' => [$this, 'addRestrain']])->get();
   // ...
}

private function addRestrain($query)
{
  $query->where('title', 'like', '%first%');
}
Run Code Online (Sandbox Code Playgroud)

然而,Laravel 检测到传递的参数不是闭包,而是数组:

“类型错误:传递给 Illuminate\Database\Eloquent\Builder::eagerLoadRelation() 的参数 3 必须是 Closure 的实例,给定数组,在

这是否意味着不能使用类函数来实现急切加载约束?

rai*_*7ow 6

从 PHP 7.1.0 开始,您可以使用Closure::fromCallable文档):

$users = App\User::with(
  [ 'posts' => \Closure::fromCallable([$this, 'addRestrain']) ]
)->get();
Run Code Online (Sandbox Code Playgroud)

否则,您只能使用匿名函数包装$this->addRestrain调用。