Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Kako se sinhronizirajte syncWithoutDetaching.


Kako se sinhronizirajte syncWithoutDetaching.


Metoda "SyncWithoutDetaching" v Laravelu je zasnovana tako, da doda nova razmerja med vrtilno tabelo, ki je večkrat, ne da bi odstranila obstoječe. Glede tega, kako obravnava podvojene ID -je, je tu podrobna razlaga:

- Ko pokličete `SyncWithoutDetaching" z množico ID -jev, bo Laravel priložil samo tiste ID -je, ki za to razmerje še niso v vrtilni tabeli. Ne odstranjuje obstoječih odnosov, za razliko od standardne metode "sinhronizacije", ki odvaja vse ID -je, ki niso v določenem matriku [1] [5] [6].

- Vendar `SyncWithoutDetaching` sama po sebi ne preprečuje dvojnikov, če jim omogoča vrtilna tabela ali logika vaše aplikacije. Če tabela vrtenja nima edinstvene omejitve na kombinaciji tujih tipk, je mogoče, da se podvojitvene vnose vstavite, če se metoda imenuje napačno ali če ji shema baze podatkov omogoča [3] [7] [8].

- Da bi se izognili dvojnikom, je priporočljivo uveljaviti edinstven sestavljeni ključ na stolpcih vrtilnih tabel (npr. Dva stolpca tujih ključev) na ravni baze podatkov. To zagotavlja, da poskusi vstavljanja podvojenih vrstic ne bodo uspeli, v svoji aplikaciji pa lahko rešite takšne izjeme [8].

- Interno `SyncWithoutDetaching` deluje tako, da pokliče metodo` Sync` z drugim parametrom, nastavljenim na `false`, kar pomeni, da" ne odlepi. " To povzroči, da doda nove vnose, ne da bi odstranili obstoječe. Preveri obstoječe ID -je in vstavi samo tiste, ki jim manjka, zato običajno preprečuje dodajanje dvojcev med samom operacijo, če vhodni niz ne vsebuje dvojcev [1] [6].

- Če se še vedno pojavijo dvojniki, je to pogosto posledica enega:
- Vhodni niz, ki vsebuje podvojene ID -je.
- Pomanjkanje omejitev na ravni baze podatkov.
- Uporaba `attact ()` namesto `sinhronizacije ()`, saj `atting ()` vedno dodaja nove vrstice, ne glede na obstoječe, kar potencialno povzroča dvojnika [6] [7].

Če povzamemo, `SyncWithoutDetaching` se izogne ​​dodajanju podvojenih odnosov med svojim delovanjem s pritrditvijo ID -jev, ki še niso povezani, vendar se opira na ustrezne omejitve vhoda in baze podatkov, da se v celoti prepreči podvojitev. Dodajanje edinstvenega indeksa na vrtilni tabeli je najboljša praksa za zagotovitev, da ne more obstajati podvojene vrstice. Če se pojavijo dvojniki, ponavadi kaže na manjkajoče omejitve ali nepravilno uporabo povezanih metod, kot je `attic".

Ta metoda je še posebej uporabna, če želite dodati odnose, ne da bi vplivali na obstoječe in brez tveganja podvojenih vnosov, če se pravilno uporablja z ustreznim oblikovanjem baze podatkov.

Navedbe:
[1] https://stackoverflow.com/questions/17472128/preventing-lavel-adding-moltiple-records-to-pivot-table
[2] https://laracasts.com/discuss/channels/laravel/many-to-many-sync-Method-creates-duplates-is-this-really-right-way-to-to-to
[3] https://github.com/laravel/framework/isissue/21639
[4] https://laracasts.com/discuss/channels/eloquent/belongstomany-and-wanted-duplicates
[5] https://serversideUp.net/managing-pivot-data-with-lavel-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/isissue/14270