Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Hogyan kezeli a SyncwithoutDetaching fogantyú másolatát


Hogyan kezeli a SyncwithoutDetaching fogantyú másolatát


A „SyncWithoutDetaching” módszert a Laravel-ben úgy tervezték, hogy új kapcsolatokat hozzon létre egy sok-sok pivot táblához, anélkül, hogy a létezőt eltávolítaná. Ami a duplikált azonosítók kezelését illeti, itt van egy részletes magyarázat:

- Ha a „SyncwithoutDetaching” -et hívja egy azonosítóval, a Laravel csak azokat az azonosítókat csatolja, amelyek még nincsenek a Pivot táblázatban a kapcsolathoz. Nem távolítja el a meglévő kapcsolatokat, ellentétben a standard „szinkronizálás” módszerrel, amely leválasztja azokat az ID -ket, amelyek nem a megadott tömbben [1] [5] [6].

- Ugyanakkor maga a "SyncWithoutDetaching" nem akadályozza meg a másolatokat, ha a pivot táblázat vagy az alkalmazás logikája lehetővé teszi őket. Ha a Pivot táblázatnak nincs egyedi korlátozása az idegen kulcsok kombinációjára, akkor a duplikált bejegyzések beillesztése, ha a módszert helytelenül hívják, vagy ha az adatbázis -séma megengedi [3] [7] [8].

- A másolatok elkerülése érdekében ajánlott egy egyedi kompozit kulcs érvényesítése a Pivot táblázat oszlopaiban (például a két idegen kulcsoszlop) az adatbázis szintjén. Ez biztosítja, hogy a párhuzamos sorok beszúrásának megkísérelése meghibásodjon, és ezeket a kivételeket az alkalmazásában kezelheti [8].

. Ez azt eredményezi, hogy új bejegyzéseket ad hozzá a meglévők eltávolítása nélkül. Ellenőrzi a meglévő azonosítókat, és csak azokat a hiányzóokat illeszti be, így általában megakadályozza a másolatok hozzáadását a művelet során, ha a bemeneti tömb nem tartalmaz másolatokat [1] [6].

- Ha még mindig megjelennek a másolatok, akkor ez gyakran:
- A bemeneti tömb, amely duplikált azonosítókat tartalmaz.
- Az adatbázis-szintű korlátozások hiánya.
- A `csatolás ()` használatával a `syncwithoutDetaching ()` helyett, mivel a `csatlakozás ()` mindig új sorokat ad hozzá, a meglévőktől függetlenül, potenciálisan másolatokat okozva [6] [7].

Összefoglalva: a „SyncWithoutDetaching” elkerüli a duplikált kapcsolatok hozzáadását a művelet során, csak olyan azonosítóinak csatolásával, amelyek még nem állnak kapcsolatban, de a megfelelő bemeneti és adatbázis -korlátozásokra támaszkodik a duplikátumok teljes mértékben megakadályozása érdekében. Az egyedi index hozzáadása a pivot táblázathoz a legjobb gyakorlat annak biztosítása érdekében, hogy ne létezzen másolatú sorok. Ha másolatok fordulnak elő, ez általában a hiányzó korlátozásokat vagy a kapcsolódó módszerek nem megfelelő használatát jelzi, mint például a „Csatlakozás”.

Ez a módszer különösen akkor hasznos, ha kapcsolatokat szeretne hozzáadni anélkül, hogy befolyásolná a létezőt, és anélkül, hogy a megfelelő adatbázis -tervezéssel megfelelően használnák a másolatokat, ha helyesen használják.

Idézetek:
[1] https://stackoverflow.com/questions/17472128/Preventing-Laravel-adding-Multiple-records-a-a-Pivot-table
[2] https://laracasts.com/discuss/channels/laravel/Many-to-many-sync-method-creates-duplicates-is-this-really-the-way-to-do-it
[3] https://github.com/laravel/framework/issues/21639
[4] https://laracasts.com/discuss/channels/eloquent/belongstomany-and-wanted-duplicates
[5] https://serversideup.net/managing-pivot-data-with-laravel-eloquent/
[6] https://stackoverflow.com/questions/62104188/laravel-eloquent-atach-vs-syncwithoutdetaching
[7] https://www.youtube.com/watch?v=dcrisowswti
[8] https://github.com/laravel/framework/issues/14270