حسین
7 سال پیش توسط حسین مطرح شد
4 پاسخ

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

سلام دوستان
من داخل 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 تعریفش کنم ..
به نظر شما راه حل چیه ؟


ثبت پرسش جدید
حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 7 سال پیش آپدیت شد
0

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

  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');
   });

حسین
@hosseinyaghmaee 7 سال پیش مطرح شد
1

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


مسعود عیوضی
@massoud.1989 7 سال پیش مطرح شد
0

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


مسعود عیوضی
@massoud.1989 7 سال پیش آپدیت شد
1

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

 $table->engine = 'InnoDB';

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

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


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام