我将约束急切加载与匿名函数一起使用:
$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 的实例,给定数组,在
这是否意味着不能使用类函数来实现急切加载约束?
从 PHP 7.1.0 开始,您可以使用Closure::fromCallable(文档):
$users = App\User::with(
[ 'posts' => \Closure::fromCallable([$this, 'addRestrain']) ]
)->get();
Run Code Online (Sandbox Code Playgroud)
否则,您只能使用匿名函数包装$this->addRestrain调用。
| 归档时间: |
|
| 查看次数: |
2952 次 |
| 最近记录: |