Перемещение построителя сводных запросов из контроллера в область модели

#laravel #laravel-8

Вопрос:

В настоящее время это работает в моем контроллере:

 use AppModelsOrganisation;
use AppModelsUser;

public function show(User $user)
{
    $orgs = Organisation::with([
            'users' => function ($query) use ($user) {
                $query->where('user_id', '=', $user->id)
                      ->orWhereNull('user_id');
            }
        ])
        ->get();

    dd($orgs);
}
 

Я хотел бы как можно больше перейти к модели, используя динамическую локальную область. Я пытался:

 public function scopeAllOrgsOneUserMemberOrNot($query, $user)
{
    $query->where('user_id', '=', $user->id)->orWhereNull('user_id');
}
 

Но когда я бегу:

 public function show(User $user)
{
    $orgs = Organisation::with(['users' => function ($query) use ($user) {
        $query->AllOrgsOneUserMemberOrNot($query, $user);
    }])->get();
    dd($orgs);
}
 

Я возвращаю следующее исключение ErrorException:
Undefined property: IlluminateDatabaseEloquentRelationsBelongsToMany::$id

Как переместить этот фрагмент построителя запросов в область видимости?

Ответ №1:

Первый параметр области не нужно передавать. Проверьте пример в документации. function scopeActive($query) { ... } превращается в active() .

 $query->AllOrgsOneUserMemberOrNot($user);
 

Это должно сработать.