เมธอด `syncwithoutdetaching` ใน Laravel ได้รับการออกแบบมาเพื่อเพิ่มความสัมพันธ์ใหม่ในตารางเดือยแบบหลายต่อหลายครั้งโดยไม่ต้องลบความสัมพันธ์ที่มีอยู่ เกี่ยวกับวิธีจัดการ ID ที่ซ้ำกันนี่คือคำอธิบายโดยละเอียด:
- เมื่อคุณเรียก `syncwithoutdetaching` ด้วยอาร์เรย์ของ IDs Laravel จะแนบเฉพาะ ID เหล่านั้นที่ไม่ได้อยู่ในตาราง Pivot สำหรับความสัมพันธ์นั้น มันไม่ได้ลบความสัมพันธ์ที่มีอยู่ซึ่งแตกต่างจากวิธีมาตรฐาน `sync` ซึ่งแยก ID ใด ๆ ที่ไม่ได้อยู่ในอาร์เรย์ที่ให้ไว้ [1] [5] [6]
- อย่างไรก็ตาม `syncwithoutdetaching` ตัวเองไม่ได้ป้องกันการทำซ้ำโดยเนื้อแท้หากตารางเดือยหรือตรรกะแอปพลิเคชันของคุณอนุญาต หากตารางเดือยไม่มีข้อ จำกัด ที่ไม่ซ้ำกันในการรวมกันของคีย์ต่างประเทศเป็นไปได้ที่จะใส่รายการซ้ำหากวิธีการนี้เรียกว่าไม่ถูกต้องหรือหากสคีมาฐานข้อมูลอนุญาต [3] [7] [8]
- เพื่อหลีกเลี่ยงการทำซ้ำขอแนะนำให้บังคับใช้คีย์คอมโพสิตที่ไม่ซ้ำกันในคอลัมน์ตารางเดือย (เช่นคอลัมน์คีย์ต่างประเทศทั้งสองคอลัมน์) ที่ระดับฐานข้อมูล สิ่งนี้ทำให้มั่นใจได้ว่าความพยายามที่จะแทรกแถวที่ซ้ำกันจะล้มเหลวและคุณสามารถจัดการกับข้อยกเว้นดังกล่าวในแอปพลิเคชันของคุณ [8]
- ภายใน `syncwithoutdetaching` ทำงานโดยการเรียกใช้เมธอด` sync` ด้วยพารามิเตอร์ที่สองที่ตั้งค่าเป็น `false 'ซึ่งหมายถึง" อย่าแยกออก " สิ่งนี้ทำให้มันเพิ่มรายการใหม่โดยไม่ต้องลบรายการที่มีอยู่ มันตรวจสอบ ID ที่มีอยู่และแทรกเฉพาะที่หายไปดังนั้นโดยทั่วไปแล้วจะป้องกันการเพิ่มซ้ำระหว่างการดำเนินการเองหากอาร์เรย์อินพุตไม่มีการทำซ้ำ [1] [6]
- หากยังคงปรากฏขึ้นอีกมักจะเกิดจาก:
- อาร์เรย์อินพุตที่มี ID ซ้ำ
- ขาดข้อ จำกัด ระดับฐานข้อมูล
- การใช้ `แนบ ()` แทนที่จะเป็น `syncwithoutdetaching ()` เนื่องจาก `แนบ ()` เพิ่มแถวใหม่เสมอโดยไม่คำนึงถึงแถวที่มีอยู่อาจทำให้เกิดซ้ำ [6] [7]
โดยสรุป `syncwithoutdetaching` หลีกเลี่ยงการเพิ่มความสัมพันธ์ที่ซ้ำกันในระหว่างการดำเนินการโดยการแนบ ID ที่ไม่เกี่ยวข้องแล้ว แต่ขึ้นอยู่กับข้อ จำกัด อินพุตและฐานข้อมูลที่เหมาะสมเพื่อป้องกันการทำซ้ำอย่างเต็มที่ การเพิ่มดัชนีที่ไม่ซ้ำกันในตาราง Pivot เป็นแนวปฏิบัติที่ดีที่สุดเพื่อให้แน่ใจว่าไม่มีแถวที่ซ้ำกัน หากมีการทำซ้ำเกิดขึ้นมักจะบ่งบอกถึงข้อ จำกัด ที่ขาดหายไปหรือการใช้วิธีที่เกี่ยวข้องอย่างไม่เหมาะสมเช่น `แนบ '
วิธีนี้มีประโยชน์อย่างยิ่งเมื่อคุณต้องการเพิ่มความสัมพันธ์โดยไม่ส่งผลกระทบต่อสิ่งที่มีอยู่และโดยไม่ต้องเสี่ยงกับรายการที่ซ้ำกันหากใช้อย่างถูกต้องกับการออกแบบฐานข้อมูลที่เหมาะสม
การอ้างอิง:
[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-duperplepates-is-his-his-his-his-his-his-his
[3] https://github.com/laravel/framework/issues/21639
[4] https://laracasts.com/discuss/channels/eloquent/belongstomany-and-wanted-duplecates
[5] https://serversideup.net/managing-pivot-data-with-laravel-eloquent/
[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