이 기사의 출처는 https://medium.com/@hafiqiqmal93/laravel-softdelete-avoiding-the-unique-constraint-problem-45381d9745a0입니다.
한동안 Laravel을 사용해 오신 경우, 특히 프로젝트에 데이터 무결성이 관련되어 있는 경우 SoftDelete 기능을 이미 접하셨을 가능성이 높습니다. 실제로 데이터베이스에서 레코드를 꺼내지 않고도 레코드를 "삭제"할 수 있기 때문에 매우 유용합니다. Laravel이 하는 일은 삭제된 것으로 표시되지만 시스템에는 남아 있도록 삭제된_at 타임스탬프를 추가하는 것입니다. 기록 데이터를 유지하는 것은 모두 좋은 일이지만 잠재적으로 까다로운 문제가 발생합니다. 일시 삭제된 레코드를 복원할 때 고유 제약 조건은 어떻게 되나요?
이는 데이터베이스에 이미 고유한 이메일이나 사용자 이름이 있는 기록을 복원하려는 경우 문제가 됩니다. Laravel은 오류를 발생시키고 진행을 중지합니다. 다행히도 아주 깔끔하게 이 문제를 피할 수 있는 쉬운 방법이 있습니다.
Laravel에서 SoftDelete를 사용할 때 고유한 제약 조건을 우회하는 데 도움이 되는 특성을 사용하는 솔루션을 살펴보겠습니다.
기본적인 예를 들어보겠습니다. 고유해야 하는 이메일 필드가 있는 사용자 테이블이 있다고 가정해 보겠습니다.
Schema::create('users', function (Blueprint $table) { $table->string('email')->unique(); $table->softDeletes(); });
[email protected] 이메일을 사용하는 사용자를 일시 삭제한 후 나중에 동일한 이메일을 사용하여 새 사용자를 생성하면 Laravel은 이메일 필드의 고유 제약 조건에 대해 불만을 표시하고 오류를 발생시킵니다. 같은 상황에서 삭제된 사용자를 복원하려고 하면 Laravel은 이메일 필드의 고유 제약 조건에 대해 불평하고 동일한 오류를 발생시킵니다.
이것은 특히 기록 복원이 일반적인 작업인 대규모 시스템을 처리할 때 골칫거리가 됩니다.
이를 방지하기 위해 레코드가 일시 삭제될 때 고유 필드의 값을 일시적으로 변경하고 레코드를 다시 가져올 때 원래 값을 복원할 수 있습니다. 이렇게 하면 일시 삭제 또는 복원 중에 데이터베이스가 고유 제약 조건을 초과하지 않습니다.
Laravel 특성은 이 기능을 캡슐화하는 좋은 방법입니다. 문제를 처리하는 데 사용할 수 있는 특성은 다음과 같습니다.
trashed()) { foreach ($model->getDuplicateAvoidColumns() as $column) { // handle for Spatie Translatable library if (method_exists($model, 'getTranslatableAttributes')) { $translates = $model->getTranslatableAttributes(); if (in_array($column, $translates)) { foreach ($translates as $translate) { if ($translate === $column) { $values = $model->getTranslations($column); foreach ($values as $translation => $value) { $values[$translation] = (explode('--', $value)[1] ?? $value); } $model->setTranslations($column, $values); break; } } continue; } } if ($value = (explode('--', $model->{$column})[1] ?? null)) { $model->{$column} = $value; } } } }); static::deleted(function ($model): void { foreach ($model->getDuplicateAvoidColumns() as $column) { // handle for Spatie Translatable library if (method_exists($model, 'getTranslatableAttributes')) { $translates = $model->getTranslatableAttributes(); if (in_array($column, $translates)) { foreach ($translates as $translate) { if ($translate === $column) { $values = $model->getTranslations($column); foreach ($values as $translation => $value) { $values[$translation] = time() . '--' . $value; } $model->setTranslations($column, $values); break; } } continue; } } $model->{$column} = time() . '--' . $model->{$column}; } $model->save(); }); } }
이 특성은 두 가지 일을 합니다:
Laravel 모델에 이 특성을 적용하는 방법은 다음과 같습니다.
class User extends Model { use SoftDeletes, AvoidDuplicateConstraintSoftDelete; // Specify which columns should avoid the unique constraint issue public function getDuplicateAvoidColumns(): array { return ['email', 'username']; } }
모델에 **AvoidDuplicateConstraintSoftDelete** 특성을 추가하고 고유 제약 조건 충돌(예: 이메일 및 사용자 이름)을 피해야 하는 열을 지정하면 이러한 문제를 쉽게 방지할 수 있습니다. .
즉, 레코드 일시 삭제 시 일부 고유 제약 조건으로 인해 추가 작업과 충돌이 발생하지 않는다는 의미입니다. 즉, 이 방법을 사용하면 고유한 필드에 타임스탬프를 추가하여 고유성 측면에서 데이터베이스에 대해 "숨겨진" 레코드를 렌더링할 수 있지만 필요할 때 여전히 복구할 수 있습니다.
이 기능은 대규모 데이터베이스를 처리할 때 매우 유용하며 레코드 복원이 매우 일반적입니다. 일시 삭제된 사용자나 다른 모델을 가져올 때마다 "중복 항목" 오류를 처리할 필요가 없습니다.
Laravel에서 가장 유용한 것은 SoftDelete이지만 때로는 고유한 제약 조건으로 작업할 때 골치 아픈 일이 됩니다. 삭제 시 고유 필드를 일시적으로 변경하고 나중에 복원함으로써 문제를 피할 수 있는 우아한 방법을 제공하는 간단한 특성 기반 솔루션이 있습니다. 이렇게 하면 실망스러운 실수를 피하고 데이터베이스의 고유한 제약 조건을 위반하지 않고 애플리케이션이 원활하게 작동할 수 있습니다.
필드가 다국어로 만들어졌거나 Spatie의 Translatable과 같은 라이브러리를 사용하는 경우 위의 솔루션은 이러한 각 경우에 문제 없이 작동합니다. SoftDeletes는 방해가 되지 않고 유연성을 제공하기 위한 것입니다. 위의 사소한 수정 사항을 적용하면 대부분의 함정을 피하고 데이터를 깔끔하게 유지하며 사용자를 만족시킬 수 있습니다.
이 특성을 모델에 추가하면 특히 일시 삭제 및 복원 작업이 자주 수행되는 대규모 데이터 세트를 처리하는 경우 시간과 골치 아픈 일을 줄일 수 있습니다. Laravel 프로젝트에서 시도해 보시면 까다로운 고유 제약 조건 문제를 얼마나 원활하게 처리하는지 확인하실 수 있습니다!
읽어주셔서 감사합니다! 시스템 설계 및 전자 상거래 혁신에 대한 최신 업데이트에 대한 정보를 얻으려면 구독하는 것을 잊지 마십시오. 즐거운 디자인 되세요!
이 기사가 통찰력이 있고 시스템 설계 및 기술 동향에 대한 더 많은 콘텐츠로 최신 정보를 받고 싶다면 다음에서 저를 팔로우하세요.-
트위터: https://twitter.com/hafiqdotcom
링크드인: https://www.linkedin.com/in/hafiq93
커피 사세요: https://paypal.me/mhi9388 /
https://buymeacoffee.com/mhitech
매체: https://medium.com/@hafiqiqmal93
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3