مسأله:
قطعا همه ما با unique index type یا همون محدودیت فیلدهای یکتا کار کردیم و آشنا هستیم. هدف از تعریف این محدودیت روی ستون یا ستونهای جدول در پایگاه داده جلوگیری از ورود دادههای تکراری و اطمینان از عدم وقوع این مسئله در جدول مورد نظر هست.
امروز میخوایم در خصوص چالشی که استفاده از این محدودیت در لاراول برای ما به وجود میاره و راه حل اون با شما صحبت کنیم. حتما از SoftDelete در لاراول استفاده کردین. خب مشکل دقیقا از همینجا شروع میشه. وقتی شما در یک مدل از SoftDelete استفاده میکنید قراره که حذف فقط به صورت منطقی اتفاق بیفته و نه فیزیکی. پس طبیعتا داده ای که منطقاً حذف شده، در جدول وجود داره و صرفا مقدار deleted_at از NULL به یک مقدار از نوع تاریخ و زمان تغییر کرده.
خب حالا وقتی ما دادهای رو به صورت Soft حذف میکنیم و در برنامه دیگه اثری از اون نمیبینیم، پس باید منطقا بتونیم دوباره تعریفش کنیم! اینجاست که پایگاه داده میاد وسط!!! و به ما میگه که اگر چه شما دیتا رو به صورت منطقی حذف کردی ولی از دید من حذفی انجام نشده! و حق نداری دیتای تکراری وارد کنی! پس باید چیکارکرد؟
راه حل:
راه حل ساده تر از اون چیزی هست که فکر میکنید.
✅فقط کافیه که حین تعریف یکتا بودن یک فیلد (مثلا email) اون فیلد رو به همراه deleted_at یکتا کنید💡
این کار رو می توان در دیتابیس و یا در میگریشن انجام داد. به همین راحتی! حالا وقتی که یک رکود از جدول حذف منطقی میشه (یعنی deleted_at مقدار میگیره) اضافه کردن یک رکورد با مقادیر فیلدیکتایی که رکوردش قبلا حذف شده، ممکن میشه. برای اعتباریابی در سمت لاراول هم باید NULL بودن deleted_at رو چک کنید.