fix:역할 동기화 시 unique 제약조건 충돌 해결

- soft delete된 레코드가 있을 때 새 레코드 생성 대신 복원
- withTrashed()로 기존 레코드 확인 후 처리
- 불필요한 역할만 선별적으로 삭제

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
pro
2026-01-31 11:54:45 +09:00
parent 599098a481
commit 9eaf13b950

View File

@@ -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(),
]);
}
}
}