اشکال در پاک شدن خودکار کلید خارجی

- 2 سال پیش
توسط مسعود عیوضی آپدیت شد
حسین ( 306 تجربه )
2 سال پیش

سلام دوستان
من داخل migration کد مربوط به پاک شدن رکورد های مربوط به کلید خارجی رو گذاشتم .. ولی بعد از پاک شدن رکورد اصلی .. رکورد جدول مرتبط پاک نمیشد .


            $table->integer('question_id')->unsigned();
            $table->foreign('question_id')->references('id')->on('questions')->onDelete('cascade');

تو اینترنت سرچ کردم و به این نکته رسیدم که باید database engine رو برابر InnoDB قرار بدم

 $table->engine = 'InnoDB';

ولی بعد اینکه این کار رو انجام دادم دیگه migration مربوط به کلید خارجی کلا اجرا نمیشه و ارور میده .


  [Illuminate\Database\QueryException]
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `answers` add constraint `answer
  s_question_id_foreign` foreign key (`question_id`) references `questions` (`id`) on delete cascade)

  [PDOException]
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

راه حلی بعدی اینه که کد های مربوط به حذف اتوماتیک رکورد ها رو تو مدل مربوطه قرار بدم

 protected static function boot() {
        parent::boot();
        static::deleting(function($question) {
            $question->answers()->delete();

        });
    }

این روش جواب داد .. ولی من همچنان میخوام که این کار توسط خود MySql انجام بشه و داخل migration تعریفش کنم ..
به نظر شما راه حل چیه ؟

حسام موسوی ( 204334 تجربه )
2 سال پیش
تخصص : طراح و برنامه نویس

بنظرم یکبار بصورت زیر عمل کنید و ببینید نتیجه چطور میشه

  Schema::create('answers', function($table) {
     ...
      $table->integer('question_id')->unsigned();
     ...
    });

   Schema::table('answers', function($table) {
            $table->foreign('question_id')->references('id')->on('questions')->onDelete('cascade');
   });
حسین ( 306 تجربه )
2 سال پیش

این کار رو هم کردم مهندس
ولی جواب نداد

مسعود عیوضی ( 57 تجربه )
2 سال پیش

منم دقیقا این مشکل رو دارم.اگه راه حل رو پیدا کردید به اشتراک بزارید لطفا، چون واقعا اعصابمو ریخته بهم

مسعود عیوضی ( 57 تجربه )
2 سال پیش

من جواب گرفتم.

 $table->engine = 'InnoDB';

این دستور رو در خط اول migration هر دوتا جدولی که با هم رابطه دارن استفاده کن
یا تو فایل database.php تو پوشه config برای کل پروژت مشخص کن
دقت کن اگه تو فایل database.php خواستی این کارو بکنی حواست باشه تو اون آرایه تنظیمات mysql خودش به صورت پیش فرض برابر false نزاشته باشه گزینه engine رو.

یک نکته دیگه هم داشت که بعد از چند روز سردرد بالاخره کشف شد.
شما نباید مایگریشن جدول میانی دو جدول رو داخل مایگریشن یکی از دو جدول مرتبط بنویسی و باید برای جدول های میانی هم مایگریشن جدا درست کنی.
امیدوارم رسونده باشم مطلبو

برای ارسال پاسخ باید وارد سایت شوید