ایجاد 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 تعریف کرده ایم.

1 نظر / نظر خود را در زیر وارد کنید

  1. سلام وقتتون بخیر باشه
    من با لاراول 8.83 پروژه ای رو دارم کار میکنم زمان مایگریت کردن دیتابیس از کلید های خارجی ایراد میگیره به این شکل کلید کار کردم:
    public function up()
    {
    Schema::create(‘users’, function (Blueprint $table) {
    $table->id();
    $table->string(‘name’);
    $table->string(‘last_name’);
    $table->string(‘national_code’);
    $table->string(‘phone’);
    $table->string(‘birthday’);
    $table->tinyInteger(‘gender’);
    $table->string(‘bank_number’);
    $table->unsignedInteger(‘province_id’);
    $table->string(’email’)->unique();
    $table->timestamp(’email_verified_at’)->nullable();
    $table->string(‘password’);
    $table->foreign(‘province_id’)->references(‘id’)->on(‘provinces’)->onDelete(‘cascade’);
    $table->rememberToken();
    $table->timestamps();
    });
    }

    public function up()
    {
    Schema::create(‘provinces’, function (Blueprint $table) {
    $table->id();
    $table->string(‘province’);
    $table->string(‘city’);
    $table->boolean(‘active’);
    $table->timestamps();
    });
    }

    اینم از خطایی که میده
    Migration table created successfully.
    Migrating: 2014_10_12_000000_create_users_table

    ➜ 712▕ throw new QueryException(
    713▕ $query, $this->prepareBindings($bindings), $e
    714▕ );
    715▕ }
    716▕ }

    1 D:\xampp\htdocs\kliniketo-website\vendor\laravel\framework\src\Illuminate\Database\Connection.php:501
    PDOException::(“SQLSTATE[HY000]: General error: 1005 Can’t create table `kliniketo_db`.`#sql-74b8_d3` (errno: 150 “Foreign key constraint is incorrectly formed”)”)
    کلید خارجی رو که حذف میکنم به سادگی مایگریت میشه مدل های مختلف forienId رو هم تست کردم اما جواب نمیده

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