Η μέθοδος `syncwithoutdetaching 'στο Laravel έχει σχεδιαστεί για να προσθέσει νέες σχέσεις σε έναν πίνακα περιστροφής πολλών προς πολλούς χωρίς να αφαιρεί τα υπάρχοντα. Όσον αφορά τον τρόπο με τον οποίο χειρίζεται διπλά αναγνωριστικά, εδώ είναι μια λεπτομερής εξήγηση:
- Όταν καλείτε το `syncwithoutdetaching` με μια σειρά από τα IDs, ο Laravel θα επισυνάψει μόνο εκείνα τα αναγνωριστικά που δεν υπάρχουν ήδη στον πίνακα περιστροφής για τη σχέση αυτή. Δεν καταργεί τις υπάρχουσες σχέσεις, σε αντίθεση με την τυπική μέθοδο `sync 'που αποσπάται οποιαδήποτε IDS όχι στον παρεχόμενο πίνακα [1] [5] [6].
- Ωστόσο, το ίδιο το `syncwithoutdetaching` δεν αποτρέπει εγγενώς τα διπλότυπα εάν ο πίνακας περιστροφής ή η λογική της εφαρμογής σας επιτρέπει. Εάν ο πίνακας PIVOT δεν έχει μοναδικό περιορισμό στο συνδυασμό ξένων κλειδιών, είναι δυνατόν να εισαχθούν διπλές καταχωρίσεις εάν η μέθοδος ονομάζεται εσφαλμένα ή εάν το σχήμα βάσης δεδομένων το επιτρέπει [3] [7] [8].
- Για να αποφευχθούν τα αντίγραφα, συνιστάται η επιβολή ενός μοναδικού σύνθετου κλειδιού στις στήλες πίνακα περιστροφής (π.χ., οι δύο στήλες ξένου κλειδιού) στο επίπεδο της βάσης δεδομένων. Αυτό εξασφαλίζει ότι η προσπάθεια εισαγωγής διπλών σειρών θα αποτύχει και μπορείτε να χειριστείτε τέτοιες εξαιρέσεις στην αίτησή σας [8].
- Εσωτερικά, τα έργα "SyncWithoutdetaching" καλώντας τη μέθοδο "συγχρονισμού" με τη δεύτερη παράμετρο που έχει οριστεί σε "False", που σημαίνει "δεν αποσυνδέετε". Αυτό το προκαλεί να προσθέσει νέες καταχωρήσεις χωρίς να αφαιρέσουν τις υπάρχουσες. Ελέγχει τα υπάρχοντα αναγνωριστικά και εισάγει μόνο εκείνα που λείπουν, επομένως συνήθως εμποδίζει την προσθήκη διπλότυπων κατά τη διάρκεια της ίδιας της λειτουργίας εάν ο πίνακας εισόδου δεν περιέχει διπλότυπα [1] [6].
- Εάν εξακολουθούν να εμφανίζονται αντίγραφα, συχνά οφείλεται είτε:
- Ο πίνακας εισόδου που περιέχει διπλά αναγνωριστικά.
- Έλλειψη περιορισμών σε επίπεδο βάσης δεδομένων.
- Χρησιμοποιώντας το `attach ()` αντί του `syncwithoutDetaching ()`, αφού `attach ()` `Προσθέτει πάντα νέες σειρές ανεξάρτητα από τις υπάρχουσες, ενδεχομένως προκαλώντας αντίγραφα [6] [7].
Συνοπτικά, το `syncwithoutdetaching 'αποφεύγει την προσθήκη διπλών σχέσεων κατά τη διάρκεια της λειτουργίας του, συνδέοντας μόνο τα αναγνωριστικά που δεν έχουν ήδη συσχετιστεί, αλλά βασίζεται σε κατάλληλους περιορισμούς εισόδου και βάσης δεδομένων για να αποτρέψουν πλήρως τα αντίγραφα. Η προσθήκη ενός μοναδικού ευρετηρίου στον πίνακα περιστροφής είναι η βέλτιστη πρακτική για να εξασφαλιστεί ότι δεν μπορεί να υπάρξει διπλές σειρές. Εάν εμφανιστούν αντίγραφα, υποδεικνύει συνήθως περιορισμούς που λείπουν ή ακατάλληλη χρήση σχετικών μεθόδων όπως το `Attach '.
Αυτή η μέθοδος είναι ιδιαίτερα χρήσιμη όταν θέλετε να προσθέσετε σχέσεις χωρίς να επηρεάσετε τις υπάρχουσες και χωρίς να διακινδυνεύσετε διπλές καταχωρήσεις εάν χρησιμοποιούνται σωστά με τον κατάλληλο σχεδιασμό βάσης δεδομένων.
Αναφορές:
[1] https://stackoverflow.com/questions/17472128/preventing-laravel-adding-multiple-records-to-a-pivot-table
[2] https://laracasts.com/discuss/channels/laravel/many-tan-many-sync-method-remeates-duplicates-is-this-erally-the-right-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-attach-vs-syncwithoutdetaching
[7] https://www.youtube.com/watch?v=dcrisowswti
[8] https://github.com/laravel/framework/issues/14270