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

خطای a foreign key constraint fails

سلام دوستان..

یه جدول واسط دارم به اسم
category_product

به این صورت مایگریت شده..

$table->id();
$table->bigInteger('cat_id')->unsigned();
$table->foreign('cat_id')->references('id')->on('categories')->onDelete('cascade');
$table->bigInteger('product_id')->unsigned();
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');

الان وقتی برنامه رو اجرا میکنم و میخواد محصولی بسازه که تو چند دسته بندی هست ارور زیر رو میده:

Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`myDataBase`.`category_product`, CONSTRAINT `category_product_cat_id_foreign` FOREIGN KEY (`cat_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE) (SQL: insert into `category_product` (`cat_id`, `product_id`) values (6, 1), (6, 2))

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


ثبت پرسش جدید
محمد امیری
تخصص : backend coder
@mohammadeng3731 4 سال پیش مطرح شد
2

درود.
مشکل شما اینجاست که دارید سطری رو در جدول فرزند(جدول واسط) ایجاد میکنید و مقدار بهش میدید اما نظیر اون مقدار یا id در جداول اصلی وجود نداره. تعریف فیلدهای جدولتون هم هیچ مشکلی نداره. احتمالا مایگرشن واسط رو زودتر از مایگرشن جداول اصلی دارید ایجاد میکنید یا مقادیر پیش‌فرض برای جداول واسط قرار دادید یا به صورت دستی مقادیری در پایگاه داده قبل از ماگریت کردن دستی قرار دادید.


coarad supp
تخصص : برنامه نویس لاراول
@coaradsupp 4 سال پیش مطرح شد
1

سلام به جای

bigInteger

از

unsignedInteger

استفاده کنید

مثل اینکه از لاراول 7 استفاده میکنید

به این شیوه تست کنید ببینید اوکی میشه

$table->foreignId('user_id');
Alias of $table->unsignedBigInteger('user_id').

https://laravel.com/docs/7.x/migrations#columns


محمد امیری
تخصص : backend coder
@mohammadeng3731 4 سال پیش مطرح شد
2

درود.
مشکل شما اینجاست که دارید سطری رو در جدول فرزند(جدول واسط) ایجاد میکنید و مقدار بهش میدید اما نظیر اون مقدار یا id در جداول اصلی وجود نداره. تعریف فیلدهای جدولتون هم هیچ مشکلی نداره. احتمالا مایگرشن واسط رو زودتر از مایگرشن جداول اصلی دارید ایجاد میکنید یا مقادیر پیش‌فرض برای جداول واسط قرار دادید یا به صورت دستی مقادیری در پایگاه داده قبل از ماگریت کردن دستی قرار دادید.


محسن مهری
تخصص : برنامه نویس back-end با زبان...
@mohsen.mehri6101 4 سال پیش آپدیت شد
1

سلام - شما یک primary key با نام id برای جدولت گذاشتی ؟ چرا اینکارو کردی ؟
معمولا جداول واسط دو تا کلید خارجی با همدیگه میشن primery key

$table->primary(['first', 'last']);

این خطت رو هم حذف کن

$table->id();

JBolouri
@javadbolouri72 4 سال پیش مطرح شد
0

@mohammadeng3731

نه نظیرش توی جدول اصلی وجود داره.. اطلاعات از قبل ثبت شده با این آی دی ها...
توی مایگریشن ها هم اولویت ها رعایت شده.. اگر رعایت نشه همون موقع مایگریت ارور میده...


JBolouri
@javadbolouri72 4 سال پیش مطرح شد
1

@mohsen.mehri6101

ممنون بابت نکته خوبی که گفتید..


JBolouri
@javadbolouri72 4 سال پیش مطرح شد
JBolouri
@javadbolouri72 4 سال پیش مطرح شد
0

@mohammadeng3731

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

یعنی همون چیزی که شما گفته بودید اتفاق افتاده بود..
ممنون


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

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