有没有一种方法可以在模型方法的闭包中使用$ query?

时间:2019-04-11 03:44:53

标签: php laravel

当我与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);
        }]

2 个答案:

答案 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

能否请您解释一下我在这里想念什么?