تم تصميم طريقة syncwithoutDetaching` في Laravel لإضافة علاقات جديدة إلى جدول محوري للعديد من العدد دون إزالة أي منها موجود. فيما يتعلق بكيفية معالجة معرفات مكررة ، إليك تفسير مفصل:
- عندما تتصل بـ `syncwithoutDetaching` مع مجموعة من المعرفات ، ستقوم Laravel فقط بتوصيل تلك المعرفات التي لم تكن موجودة بالفعل في الجدول المحوري لتلك العلاقة. لا يزيل العلاقات الموجودة ، على عكس طريقة المزامنة القياسية التي تفصل أي معرفات ليست في الصفيف المقدم [1] [5] [6].
- ومع ذلك ، فإن "syncwithoutDetaching" نفسه لا يمنع بطبيعته التكرارات إذا كان الجدول المحوري أو منطق التطبيق الخاص بك يسمح لهم بذلك. إذا لم يكن للجدول المحوري قيدًا فريدًا على مزيج من المفاتيح الخارجية ، فمن الممكن إدخال الإدخالات المكررة إذا تم استدعاء الطريقة بشكل غير صحيح أو إذا سمح مخطط قاعدة البيانات [3] [7] [8].
- لتجنب التكرارات ، يوصى بتطبيق مفتاح مركب فريد من نوعه على أعمدة الجدول المحوري (على سبيل المثال ، عمود المفاتيح الخارجية) على مستوى قاعدة البيانات. هذا يضمن أن محاولات إدراج صفوف مكررة ستفشل ، ويمكنك التعامل مع مثل هذه الاستثناءات في التطبيق الخاص بك [8].
- داخليًا ، يعمل "SyncWithoutDetaching" من خلال استدعاء طريقة "المزامنة" مع المعلمة الثانية التي تم تعيينها على "خطأ" ، مما يعني "لا تنفصل". هذا يؤدي إلى إضافة إدخالات جديدة دون إزالة الإدخالات الموجودة. إنه يتحقق من المعرفات الحالية ويدرج فقط تلك المفقودة ، لذلك يمنع عادة إضافة التكرارات أثناء العملية نفسها إذا لم تحتوي صفيف الإدخال على تكرارات [1] [6].
- إذا كانت التكرارات لا تزال تظهر ، فغالبًا ما يكون ذلك بسبب:
- صفيف الإدخال الذي يحتوي على معرفات مكررة.
- عدم وجود قيود على مستوى قاعدة البيانات.
- باستخدام `anclanting ()` بدلاً من "syncwithoutDetaching ()` ، لأن `expant ()` يضيف دائمًا صفوفًا جديدة بغض النظر عن الصفوف الموجودة ، مما قد يسبب التكرارات [6] [7].
باختصار ، يتجنب "syncwithoutDetaching" إضافة علاقات مكررة أثناء تشغيلها من خلال ربط معرفات فقط غير مرتبطة بالفعل ، ولكنها تعتمد على قيود الإدخال وقاعدة البيانات المناسبة لمنع التكرار بالكامل. تعد إضافة فهرس فريد على الجدول المحوري أفضل الممارسات لضمان عدم وجود صفوف مكررة. في حالة حدوث التكرارات ، فإنه يشير عادةً إلى القيود المفقودة أو الاستخدام غير السليم للطرق ذات الصلة مثل "الملحق".
هذه الطريقة مفيدة بشكل خاص عندما تريد إضافة علاقات دون التأثير على العلاقات الموجودة ودون المخاطرة بإدخالات مكررة إذا تم استخدامها بشكل صحيح مع تصميم قاعدة البيانات المناسبة.
الاستشهادات:
[1] https://stackoverflow.com/questions/17472128/preventing-laravel-adding-multiple-records-to-a-pivot-table
[2] https://laracasts.com/discuss/channels/laravel/many-to-many-sync-method-creates-duplicates-is-tis-neal-the-lay-way-to-way-to-do-it
[3] https://github.com/laravel/framework/issues/21639
[4] https://laracasts.com/discuss/channels/eloquent/belongstomany-and-wanted-duplicates
[5]
[6] https://stackoverflow.com/questions/62104188/laravel-eloquent-attach-vs-syncwithoutdetaching
[7] https://www.youtube.com/watch؟v=dcrisowswti
[8] https://github.com/laravel/framework/issues/14270