当我与Eager Loading合作时。假设闭包内部的逻辑太大,我想将其转换为单独的方法。我被困在$ query中。你能帮我吗?
我的代码
->with(['post' => function ($query) {
$query->whereNotNull('id');
}]
我想要:
private function modelMethod($query){
return $query->whereNotNull('id');
}
->with(['post' => $this->modelMethod($query)]
更新1:我有一个解决方案,但看起来不太优雅
private function modelMethod($query){
return $query->whereNotNull('id');
}
$that = $this;
->with(['post' => function($query) use($that){
$that->modelMethod($query);
}]
答案 0 :(得分:3)
您可以使用Scopes
用scope
来添加所需的函数名称
public function scopeIdNotNull($query)
{
return $query->whereNotNull('id');
}
然后像使用它
->with(['post' => function ($q) {
$q->idNotNull();
}]
答案 1 :(得分:1)
我知道您已经收到了答案,但是我想首先了解问题所在。所以我尝试了这个:
private function modelMethod($query)
{
return $query->where('completed', true);
}
public function testEager()
{
return User::with(['tasks' => function($query) {
return $this->modelMethod($query);
}])->get();
}
$user = Auth::user();
$user->testEager(); // works
能否请您解释一下我在这里想念什么?