Relasi many-to-many membutuhkan tabel pivot penghubung.
Contoh: User bisa punya banyak Role, Role bisa punya banyak User
Migration (tabel pivot):
Schema::create("role_user", function (Blueprint $table) {
$table->foreignId("user_id")->constrained()->cascadeOnDelete();
$table->foreignId("role_id")->constrained()->cascadeOnDelete();
$table->primary(["user_id", "role_id"]);
});
Model:
class User extends Model {
public function roles(): BelongsToMany {
return $this->belongsToMany(Role::class);
}
}
class Role extends Model {
public function users(): BelongsToMany {
return $this->belongsToMany(User::class);
}
}
Operasi:
// Tambah role ke user
$user->roles()->attach($roleId);
$user->roles()->attach([1, 2, 3]);
// Hapus role dari user
$user->roles()->detach($roleId);
// Sync (set exact roles)
$user->roles()->sync([1, 3]); // Hapus role lain, set hanya 1 & 3
// Cek relasi
$user->roles->contains($roleId); // true/false