لارافيل الجدول المحوري مع مفتاح خارجي لاغيابل
سؤال
لدي جدول محوري تم إعداده على النحو التالي:
user_roles
user_id //fk->users.id
assoc_id //nullable fk->association.id
role //varchar
لقد قمت بإعداد قاعدة البيانات الخاصة بي بهذه الطريقة لأن الأدوار تمثل علاقة كثيرة إلى كثيرة:لدى الجمعية العديد من المستخدمين ، وقد يكون المستخدم في العديد من الجمعيات.كل مستخدم له دور داخل جمعية.
ومع ذلك ، هناك بعض الأدوار الموجودة التي يمكن أن توجد خارج الجمعية.تم تكوين قاعدة البيانات لقبول قيمة فارغة في assoc_id
الحقل ويمكنني إدراج واحد يدويا من سطر الأوامر ، ولكن عندما أحاول تنفيذ
$user->roles()->attach(NULL, "outside contractor");
في ملف البذور الخاص بي ، أحصل على خطأ يقول
[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update
a child row: a foreign key constraint fails (`database`.`user_roles`, CONSTR
AINT `user_roles_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users
` (`id`)) (SQL: insert into `user_roles` () values ())
هذا مربك بشكل خاص لأنه لا ينبغي أن تشير الحجة الأولى هنا إلى assoc_id
?عندما أستبدل NULL
مع صالح assoc_id
,
$user->roles()->attach(1, "outside contractor");
إدراج يعمل بشكل جيد ، وتشير الوسيطة الأولى إلى assoc_id
في الجدول.
ما هو الخطأ?
المحلول
إذا لم تقدم مفتاحا / مفاتيح لـ attach
/sync
, ، بليغ لن إدراج أي شيء.إنه سلوك متوقع إلى حد ما ، لأن ما تحاول القيام به هو:
إنشاء ارتباط بين س و نول
هذا ليس ما يفترض أورم القيام به.
بدلا من ذلك إدراج تلك الصفوف يدويا:
$data = [
'user_id' => 99,
'assoc_id' => null,
'role' => 'outside contractor'
];
DB::table('user_roles')->insert($data);