Die "SyncwithoutDetaching" -Methode in Laravel soll eine zahlreiche Pivot-Tabelle mit neuen Beziehungen hinzufügen, ohne vorhandene zu entfernen. In Bezug auf die Umgang mit doppelten IDs finden Sie hier eine detaillierte Erklärung:
- Wenn Sie "SyncwithoutDetaching" mit einer Reihe von IDs nennen, hängt Laravel nur die IDs hinzu, die in der Pivot -Tabelle für diese Beziehung noch nicht vorhanden sind. Im Gegensatz zur Standard -Synchronisation, die IDs, die nicht im angegebenen Array [1] [5] [6], abgelöst werden, werden vorhandene Beziehungen nicht entfernt.
- "SyncwithoutDetaching" selbst verhindert jedoch nicht inhärent Duplikate, wenn die Pivot -Tabelle oder Ihre Anwendungslogik dies zulässt. Wenn die Pivot -Tabelle keine eindeutige Einschränkung für die Kombination von Fremdschlüssel aufweist, können doppelte Einträge eingefügt werden, wenn die Methode falsch aufgerufen wird oder wenn das Datenbankschema dies zulässt [3] [7] [8].
- Um Duplikate zu vermeiden, wird empfohlen, einen eindeutigen zusammengesetzten Schlüssel für die Pivot -Tabellenspalten (z. B. die beiden Fremdschlüsselspalten) auf Datenbankebene durchzusetzen. Dies stellt sicher, dass Versuche, doppelte Zeilen einzufügen, fehlschlagen und solche Ausnahmen in Ihrer Anwendung abwickeln [8].
- Innen wird "SyncwithoutDetaching" funktioniert, indem er die "Sync" -Methode mit dem zweiten Parameter auf "False" aufgerufen hat, was "nicht trennen" bedeutet. Dies führt dazu, dass es neue Einträge hinzufügt, ohne vorhandene zu entfernen. Es überprüft vorhandene IDs und fügt nur diejenigen ein, die fehlen. Daher verhindert das Hinzufügen von Duplikaten während des Betriebs selbst, wenn das Eingangsarray keine Duplikate enthält [1] [6].
- Wenn noch Duplikate auftreten, ist dies oft auf beide zurückzuführen:
- Das Eingangsarray, das doppelte IDs enthält.
- Mangel an Einschränkungen auf Datenbankebene.
- Verwenden von `contat ()` anstelle von `syncwithoutdetaching ()`, da `contode ()` immer neue Zeilen hinzufügt, unabhängig von vorhandenen, was möglicherweise Duplikate verursacht [6] [7].
Zusammenfassend lässt sich sagen, dass "SyncwithoutDetaching" während ihres Betriebs doppelte Beziehungen addiert, indem nur IDs angehängt werden, die noch nicht miteinander verbunden sind, sondern sich auf ordnungsgemäße Eingabe- und Datenbankbeschränkungen stützen, um Duplikate vollständig zu verhindern. Das Hinzufügen eines eindeutigen Index in der Pivot -Tabelle ist die beste Praxis, um sicherzustellen, dass keine doppelten Zeilen vorhanden sind. Wenn Duplikate auftreten, zeigt es normalerweise fehlende Einschränkungen oder eine unsachgemäße Verwendung verwandter Methoden wie "Attach" an.
Diese Methode ist besonders nützlich, wenn Sie Beziehungen hinzufügen möchten, ohne die vorhandenen zu beeinflussen, und ohne doppelte Einträge zu riskieren, wenn Sie mit dem richtigen Datenbankdesign korrekt verwendet werden.
Zitate:
[1] https://stackoverflow.com/questions/17472128/preventing-laravel-adding-multiple-records-to-pivot-table
[2] https://laracasts.com/discuss/channels/laravel/Many-to-many-sync-method-creates-dupripates-is-this-really-the-right-way-do-it
[3] https://github.com/laravel/framework/issues/21639
[4] https://laracasts.com/discuss/channels/eloquent/belongstomany-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