関係が適切に設定されていることを期待すると、これは whereDoesntHave()
を使用してかなり簡単に実現できます。 :
$roleToExclude = 1;
$users = User::query()
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
コメントについて:少なくとも1つの役割を持つすべてのユーザーを取得したいが、それらの役割に管理者の役割が含まれていない可能性がある場合は、次のクエリを使用できます:
$roleToExclude = 1;
$users = User::query()
->has('roles')
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
has('roles')
EXISTS
があることを確認します ユーザーの1つの役割、 whereDoesntHave('roles'、fn())
管理者の役割ではないことを確認します。
@Jino Antonyの提案された編集に関するメモ:
多対多の関係を扱う場合、すべての whereX($ col、$ val)
クエリビルダーのメソッドは、他のテーブルを操作します (役割コード> この場合)、ピボットテーブルではありません (
role_user
)。ピボットテーブルの列をクエリするには、 wherePivot('role_id'、$ roleToExclude)
を使用する必要があります。 私の例では。