将数据透视查询构建器从控制器移动到模型范围

Moving pivot query builder from controller to model scope

我目前在我的控制器中使用此功能:

use App\Models\Organisation;
use App\Models\User;

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: Illuminate\Database\Eloquent\Relations\BelongsToMany::$id

如何将此查询生成器片段移动到一个范围?

范围的第一个参数不需要传递。检查文档中的示例。 function scopeActive($query) { ... } 变成 active().

$query->AllOrgsOneUserMemberOrNot($user);

这应该有效。