بازسازی دیتابیس لاراول بدون پاک کردن همهٔ جدولها
خلاصهٔ کاملتر
دستور توکار migrate:fresh تو لاراول قبل از اینکه مایگریشنها رو دوباره اجرا کنه، همهٔ جدولها رو drop میکنه. این دقیقاً همون چیزیه که میخوای، تا وقتی که نخوای. اگه یه جدول دیتای سیدشدهای داره که نمیخوای دوباره بسازیش، یا اکانتهای تستی داری که حال نداری بعد هر تغییر دوباره درستشون کنی، این رفتارِ همهیاهیچ تو دستوپا میره. پکیج Custom Fresh ساختهٔ Mahmoud Ramadan یه دستور fresh:custom اضافه میکنه که دیتابیس رو بازسازی میکنه ولی جدولهایی که اسم میبری رو نگه میداره.
به گفتهٔ مقاله، فرض کن داری یه اپ صورتحساب اشتراکی میسازی و تمام روز رو اسکیمات رو دستکاری میکنی، ولی نمیخوای اکانتهای تست یا دیتای سیدشدهٔ plans رو هر بار از دست بدی. جدولهایی که میخوای بمونن رو یا بهصورت آرگومانِ جداشده با کاما میدی یا با فلگ --keep، که هر دو یه کار میکنن:
php artisan fresh:custom users,plans
php artisan fresh:custom --keep=users,plansبقیهٔ جدولها drop میشن و مایگریشنها دوباره اجرا میشن، پس جدولهایی که لیست کردی ردیفهاشون رو نگه میدارن و بقیهٔ اسکیما از صفر بازسازی میشه.
این دستور الگوی glob رو هم قبول میکنه که خیلی بهکار میاد. مثلاً Cashier بهتنهایی جدولهای subscriptions و subscription_items میسازه و تکتک اسم بردنشون خستهکنندهست. با یه وایلدکارت آخر کار، هر جدولی که یه پیشوند مشترک داره رو میگیره، مثلاً "users,plans,subscription_*".
چون این دستور مخربه، میتونی ازش بخوای بدون دست زدن به دیتابیس فقط گزارش بده چیکار میکنه. فلگ --explain جدولهایی که نگه میداره و جدولهایی که drop میکنه رو چاپ میکنه. میتونی با --database هم دستور رو به یه کانکشن مشخص بزنی، که وقتی بخشی از دیتا تو یه دیتابیس جداست به درد میخوره.
اگه فایل کانفیگ رو publish کنی، میتونی بهجای پاس دادن فلگهای تکراری تو هر اجرا، پیشفرضها رو تنظیم کنی. جدولهای always_keep خودکار میمونن، patterns قوانین globت رو بدون نوشتنِ هر بار اعمال میکنه، و confirm_in محیطهایی رو لیست میکنه که دستور قبل از drop کردن، صبر میکنه تا ازت تأیید بگیره:
return [
'always_keep' => ['users', 'plans'],
'patterns' => ['subscription_*'],
'confirm_in' => ['staging', 'production'],
];این دستور سهتا ایونت هم موقع اجرا dispatch میکنه که میتونی بهشون گوش بدی و کاری مثل لاگ کردن یا اجرای کارِ بعدی رو راه بندازی: RefreshingDatabase قبل از drop شدن جدولها، TablesDropped بعد از مرحلهٔ حذف، و DatabaseRefreshed وقتی مایگریشنها تموم شد. پکیج به PHP نسخهٔ ۸.۲ یا بالاتر نیاز داره و از لاراول ۱۰ تا ۱۳ پشتیبانی میکنه.
نکات کلیدی:
- fresh:custom دیتابیس رو بازسازی میکنه ولی جدولهایی که اسم میبری رو نگه میداره، برخلاف migrate:fresh که همه رو drop میکنه
- جدولها رو با آرگومانِ جداشده با کاما یا فلگ --keep مشخص میکنی
- الگوی glob با وایلدکارت آخر، گروه جدولهای همپیشوند رو یهجا میگیره
- فلگ --explain پیشنمایش میده و --database کانکشن رو انتخاب میکنه
- فایل کانفیگ پیشفرضها رو با always_keep، patterns و confirm_in تنظیم میکنه
- سه ایونت RefreshingDatabase، TablesDropped و DatabaseRefreshed موقع اجرا dispatch میشن




