ایجاد Foreign key در migration لاراول

خوب به عنوان برنامه نویس PHP و کسی که با پایگاه داده mysql آشنایی دارید حتما با foreign key کار کرده اید. برای کاربرد foreign key اجازه دهید یک مثال ساده بزنیم. فرض کنیددر پایگاه داده یک جدول به نام users ساخته اید. و در آن کاربران را ذخیره می کنید. و پست های مربوط به هر کاربر را در جدولی به نام posts ذخیره می کنید.

حال فرض کنید یکی از کاربران را به هر دلیلی حذف کنید. خوب در این صورت تکلیف پست های باقی مانده آن کاربر در جدول posts چه خواهد شد؟ باید به وسیله ای موقع حذف هر کاربر پست های مربوط به آن کاربر نیز به صورت اتوماتیک حذف شود. برای حل این مشکل در داخل جداول mysql از foreign key استفاده می کنند که شما در داخل خود پایگاه داده و phpmyadmin قادر به تعریف آن خواهید بود.

اما برویم سراصل مطلب، اینکه در داخل migration لاراول چگونه می توانیم همین کار را انجام دهیم. فرض کنید migration مربوط به users به این شکل است.

        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

حال migration مربوط به posts را به شکل زیر تنظیم میکنیم.

        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('user_id')->unsigned();
            $table->string('body','140');
            $table->nullabletimestamps();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });

خوب همان طور که میبینید user_id جدول posts را به id جدول users ارتباط داده ایم تا در هنگام حذف یک کاربر از جدول users پست های مربوط به آن کاربر از جدول posts نیز حذف شود. به یک نکته دقت کنید که وقتی یک field از یک جدول را به عنوان foreign key تعریف می کنید و آن را به یک field از جدول دیگر ارتباط می دهید باید نوع و ساختار هر دو یکسان باشد. در این مثال همان طور که مشاهده می کنید چون id جدول users از نوع bigIncrements تعریف شده، پس نوع user_id از جدول posts را هم bigInteger تعریف کرده ایم.

دیدگاهتان را بنویسید