راکت
JBolouri
JBolouri
توسط 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
@mohammadeng37315 سال پیشمطرح شد
2

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


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

سلام به جای

bigInteger

از

unsignedInteger

استفاده کنید

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

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

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

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


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

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


محسن مهری
محسن مهری
تخصص :برنامه نویس back-end با زبان php framework laravel
@mohsen.mehri61015 سال پیشمطرح شد
1

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

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

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

$table->id();

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

@mohammadeng3731

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


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

@mohsen.mehri6101

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


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

@mohammadeng3731

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

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


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

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