Migration: چطور یک کلید خارجی را drop کنیم؟

یکی از مهمترین و در عین حال قسمت‌هایی که اکثر برنامه‌نویسان لاراول نادیده می‌گیرند، متود drop در فایل‌های migration است. غالب برنامه‌نویسان بدون اینکه این بخش را تست بگیرند، به خیال اینکه مشکلی در کدشان وجود ندارد، migration را انجام داده و از آن می‌گذرند و تنها به تست متود up بسنده می‌کنند، در حالی که ایجاد خطا در migrate:rollback باعث بروز مشکلاتی برای migrate ایجاد خواهد کرد.

یکی از مشکلاتی که به وفور دیده می‌شود، در کلید های خارجی است. با مثالی نحوه ایجاد و سپس down آنرا بررسی می کنیم.

فرض کنید که می‌خواهیم یک ستون را که شامل یک کلید خارجی (foreign key) است، از جدول پایگاه داده‌مان حذف کنیم. یعنی در دستورات migrate:rollback، در حالی که پیش از drop کردن کلید خارجی بخواهیم فیلد را drop کنیم، با خطا مواجه خواهیم شد.

برای حل نمودن این موضوع، ابتدا با متود dropForeign کلید خارجی را حذف کرده، سپس فیلد مورد نظر را drop می‌کنیم.


public function down()
{
    Schema::table('posts', function(Blueprint $table){
        $table->dropForeign('posts_category_id_foreign');
        $table->dropColumn('category_id');
    });
}

مشاهده می‌کنید که برای drop کردن کلید خارجی در دستور dropForeign ابتدا نام جدول، سپس نام فیلد و در انتها کلید واژه foreign استفاده می گردد که هر کدام با یک "_" از هم جدا می‌شوند.

بدین ترتیب بدون اینکه مشکلی در rollback ایجاد گردد، یک فایل migration برای ایجاد و حذف یک فیلد با کلید خارجی ساخته ایم.

کامنت ها (0)

ارسال نظر