Metóda „SyncwithoutDetaching“ v Laravel je navrhnutá tak, aby pridávala nové vzťahy k mnohým otočným stolom o mnohých k dispozícii bez odstránenia akýchkoľvek existujúcich. Pokiaľ ide o to, ako sa zaoberá duplikátmi ID, tu je podrobné vysvetlenie:
- Keď zavoláte „SyncwithoutDetaching“ s celým radom ID, Laravel pripojí iba tie ID, ktoré ešte nie sú prítomné v otočnej tabuľke pre tento vzťah. Neodstraňuje existujúce vzťahy, na rozdiel od štandardnej metódy „synchronizácie“, ktorá oddeľuje akékoľvek ID, ktoré nie sú v poskytnutom poli [1] [5] [6].
- Avšak samotný „syncwithoutDetaching“ neodlišuje duplikáty, ak im to umožní tabuľka otočnej alebo aplikácie. Ak tabuľka Pivot nemá jedinečné obmedzenie kombinácie cudzích kľúčov, je možné, aby sa duplicitné položky vložili, ak sa metóda nazýva nesprávne alebo ak databázová schéma umožní [3] [7] [8].
- Aby sa predišlo duplikátom, odporúča sa presadzovať jedinečný kompozitný kľúč na stĺpcoch Tabuľka otočnej tabuľky (napr. Dva stĺpce cudzích kľúčov) na úrovni databázy. To zaisťuje, že pokusy o vloženie duplicitných riadkov zlyhajú a tieto výnimky zvládnete vo svojej aplikácii [8].
- Interne, `SyncwithoutDetaching` funguje volaním metódy„ Sync` s druhým parametrom nastaveným na „false“, čo znamená „neoddeľujte“. To spôsobí, že pridá nové záznamy bez odstránenia existujúcich. Kontroluje existujúce ID a vkladá iba tie, ktoré chýbajú, takže zvyčajne zabraňuje pridávaniu duplikátov počas samotnej operácie, ak vstupné pole neobsahuje duplikáty [1] [6].
- Ak sa duplikáty stále objavia, často to je spôsobené:
- Vstupné pole obsahujúce duplicitné ID.
- Nedostatok obmedzení na úrovni databázy.
- Použitie `acte ()` Namiesto `SyncwithoutDetaching ()`, pretože `acte ()` vždy pridáva nové riadky bez ohľadu na existujúce, čo potenciálne spôsobuje duplikáty [6] [7].
Stručne povedané, „SyncwithoutDetaching“ sa vyhýba pridávaniu duplicitných vzťahov počas svojej prevádzky iba pripojením ID, ktoré ešte nesúvisia, ale spolieha sa na správne vstupné a databázové obmedzenia, aby sa úplne zabránilo duplikátom. Pridanie jedinečného indexu do tabuľky Pivot je najlepšou praxou na zabezpečenie toho, aby existovali žiadne duplicitné riadky. Ak sa vyskytnú duplikáty, zvyčajne to naznačuje chýbajúce obmedzenia alebo nesprávne použitie súvisiacich metód, ako napríklad „pripojenie“.
Táto metóda je obzvlášť užitočná, ak chcete pridať vzťahy bez ovplyvnenia existujúcich a bez riskovania duplicitných položiek, ak sa používajú správne so správnym dizajnom databázy.
Citácie:
[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-ish--really-the-the-wight-wign-way-o-t-a-it
[3] https://github.com/laravel/framework/issues/21639
[4] https://laracasts.com/discuss/channels/eloquent/belongstomany-and-wanted-duplicates
[5] https://serversideup.net/manging-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