Mengharapkan bahwa hubungan diatur dengan benar, ini dapat dicapai dengan lebih mudah dengan whereDoesntHave()
:
$roleToExclude = 1;
$users = User::query()
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
Mengenai komentar:jika Anda ingin mengambil semua pengguna yang memiliki setidaknya satu peran, tetapi peran mereka mungkin tidak berisi peran admin, maka Anda dapat menggunakan kueri ini:
$roleToExclude = 1;
$users = User::query()
->has('roles')
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
has('roles')
akan memastikan ada EXISTS
satu peran untuk pengguna, sedangkan whereDoesntHave('roles', fn())
akan memastikan itu bukan peran admin.
Catatan tentang saran edit dari @Jino Antony:
Saat menangani relasi banyak ke banyak, semua whereX($col, $val)
metode pembuat kueri beroperasi di tabel lain (roles
dalam hal ini), bukan tabel pivot (role_user
). Untuk membuat kueri kolom pada tabel pivot, Anda harus menggunakan wherePivot('role_id', $roleToExclude)
dalam contoh saya.