„SyncWithOutDetaching“ metodas „Laravel“ yra skirtas pridėti naujų ryšių prie daugybės šarnyrų lentelės, nenutraukiant jokių esamų. Kalbant apie tai, kaip jis tvarko dublikatų ID, čia yra išsamus paaiškinimas:
- Kai skambinate „SyncWithOutDetaching“ su daugybe ID, „Laravel“ pridės tik tuos ID, kurių tų santykių „Pivot“ lentelėje dar nėra. Jis nepašalina esamų ryšių, skirtingai nuo standartinio „sinchronizavimo“ metodo, kuris atskirtų bet kokius ID, esančius pateiktame masyve [1] [5] [6].
- Tačiau pats „sinchronizavimas“ netrukdo dublikaems, jei „Pivot“ lentelė ar jūsų programos logika juos leidžia. Jei „Pivot“ lentelė neturi unikalaus suvaržymo, susijusio su užsienio raktų deriniu, galima įterpti dublikatų įrašus, jei metodas vadinamas neteisingai arba jei duomenų bazės schema ją leidžia [3] [7] [8].
- Norint išvengti dublikatų, rekomenduojama įgyvendinti unikalų kompozicinį raktą „Pivot“ lentelės stulpeliuose (pvz., Du užsienio raktų stulpelius) duomenų bazės lygiu. Tai užtikrina, kad bandymai įterpti dublikatų eilutes nepavyks, ir jūs galite tvarkyti tokias išimtis savo programoje [8].
- Viduje, „SyncWithOutDetaching“ veikia, vadindami „sinchronizavimo metodą“ su antru parametru, nustatytu į „False“, tai reiškia „neatsisakyk“. Dėl šios priežasties jis prideda naujų įrašų nepašalinant esamų. Jis patikrina esamus ID ir įterpia tik tuos, kurių trūksta, todėl paprastai neleidžia pridėti dublikatų pačios operacijos metu, jei įvesties masyve nėra dublikatų [1] [6].
- Jei vis dar atsiranda dublikatų, dažnai tai lemia:
- įvesties masyvas, kuriame yra dublikatų ID.
- Duomenų bazės lygio apribojimų trūkumas.
- Naudojant „pridėti ()“, o ne „sinchronizuoti“ () `, nes„ pridėti () “visada prideda naujas eilutes, nepriklausomai nuo esamų, gali sukelti dublikatų [6] [7].
Apibendrinant galima pasakyti, kad „SyncWithOutDetaching“ vengia pridėti dublikatų ryšių veikimo metu, tik pritvirtinant ID, kurie dar nėra susiję, tačiau jis priklauso nuo tinkamo įvesties ir duomenų bazės apribojimų, kad būtų galima visiškai užkirsti kelią dublikatams. Pridedant unikalų rodyklę ant „Pivot“ lentelės, geriausia praktika užtikrinti, kad būtų galima egzistuoti kopijų eilutėse. Jei įvyksta dublikatai, tai paprastai rodo trūkstamus suvaržymus ar netinkamą susijusių metodų, tokių kaip „pridėti“, naudojimą.
Šis metodas yra ypač naudingas, kai norite pridėti ryšius, nepaveikdami esamų, ir nerizikuojant kopijų įrašais, jei tinkamai naudojami tinkamai su duomenų bazės projektavimu.
Citatos:
[1] https://stackoverflow.com/questions/17472128/preventing-laravel-adding-multiple-records-to-a-a-pivot-table
[2] https://laracasts.com/discuss/channels/laravel/many-to-many-sync-method-creates-duplicates-s-this-really-the-Right-to-to-do-it
[3] https://github.com/laravel/framework/issues/21639
[4] https://laracasts.com/discuss/channels/eloquent/belongstomany-and-wanted-dublicates
[5] https://serversideup.net/managing-pivot-data-with-laravel-lequent/
[6] https://stackoverflow.com/questions/62104188/laravel-lequent-attach-vs-syncwithoutdetaching
[7] https://www.youtube.com/watch?v=dcrisowswti
[8] https://github.com/laravel/framework/issues/14270