fix:역할 동기화 시 unique 제약조건 충돌 해결
- soft delete된 레코드가 있을 때 새 레코드 생성 대신 복원 - withTrashed()로 기존 레코드 확인 후 처리 - 불필요한 역할만 선별적으로 삭제 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -273,24 +273,44 @@ private function assignSalesDepartment(User $user, int $tenantId): void
|
||||
*/
|
||||
public function syncRoles(User $user, int $tenantId, array $roleIds): void
|
||||
{
|
||||
// 영업 관련 역할만 삭제 (다른 역할은 유지)
|
||||
// 영업 관련 역할만 처리 (다른 역할은 유지)
|
||||
$salesRoleIds = Role::where('tenant_id', $tenantId)
|
||||
->whereIn('name', self::SALES_ROLES)
|
||||
->pluck('id');
|
||||
->pluck('id')
|
||||
->toArray();
|
||||
|
||||
UserRole::where('user_id', $user->id)
|
||||
->where('tenant_id', $tenantId)
|
||||
->whereIn('role_id', $salesRoleIds)
|
||||
->delete();
|
||||
// 제거할 역할 soft delete (새 역할 목록에 없는 것들)
|
||||
$roleIdsToRemove = array_diff($salesRoleIds, $roleIds);
|
||||
if (!empty($roleIdsToRemove)) {
|
||||
UserRole::where('user_id', $user->id)
|
||||
->where('tenant_id', $tenantId)
|
||||
->whereIn('role_id', $roleIdsToRemove)
|
||||
->delete();
|
||||
}
|
||||
|
||||
// 새 역할 추가
|
||||
// 새 역할 추가 (이미 있으면 복원, 없으면 생성)
|
||||
foreach ($roleIds as $roleId) {
|
||||
UserRole::create([
|
||||
'user_id' => $user->id,
|
||||
'tenant_id' => $tenantId,
|
||||
'role_id' => $roleId,
|
||||
'assigned_at' => now(),
|
||||
]);
|
||||
// soft delete된 레코드 포함하여 검색
|
||||
$existingRole = UserRole::withTrashed()
|
||||
->where('user_id', $user->id)
|
||||
->where('tenant_id', $tenantId)
|
||||
->where('role_id', $roleId)
|
||||
->first();
|
||||
|
||||
if ($existingRole) {
|
||||
// 이미 존재하면 복원 (soft delete된 경우)
|
||||
if ($existingRole->trashed()) {
|
||||
$existingRole->restore();
|
||||
}
|
||||
} else {
|
||||
// 새로 생성
|
||||
UserRole::create([
|
||||
'user_id' => $user->id,
|
||||
'tenant_id' => $tenantId,
|
||||
'role_id' => $roleId,
|
||||
'assigned_at' => now(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user