Synchronisieren einer eins-zu-viele-Beziehung in Laravel
Wenn ich eine viele-zu-viele-Beziehung, es ist super einfach zu aktualisieren, die Beziehung mit seiner sync
Methode.
Aber was würde ich verwenden, um zu synchronisieren, eine eins-zu-viele-Beziehung?
- Tabelle
posts
:id, name
- Tabelle
links
:id, name, post_id
Hier, jeder Post
können mehrere Link
s.
Ich würde gerne zum synchronisieren der links im Zusammenhang mit einem bestimmten Beitrag in die Datenbank, gegen die eine eingegeben Sammlung von links (zum Beispiel aus einer CRUD-form, wo ich kann hinzufügen, entfernen und ändern von links).
Links in der Datenbank, die nicht in meine Ideen-Sammlung entfernt werden soll. Links, die in der Datenbank vorhanden sein und in meinem Eingang sollte aktualisiert werden der input und die links, die sind nur in meinem Eingang sollte Hinzugefügt werden als neue Datensätze in der Datenbank.
Zusammenzufassen, die das gewünschte Verhalten:
- inputArray = true /db = false ---ERSTELLEN
- inputArray = false /db = true ---LÖSCHEN
- inputArray = true /db = true - - - - - UPDATE
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider gibt es keine
sync
- Methode für das eins-zu-viele-Beziehungen. Es ist ziemlich einfach, um es selbst zu tun. Zumindest, wenn man keine foreign key-Referenzierunglinks
. Denn dann können Sie einfach löschen Sie die Zeilen und fügen Sie Sie alle wieder.Wenn Sie wirklich brauchen, zu aktualisieren bestehende (aus welchem Grund auch immer), musst du genau das tun, was Sie beschrieben haben, in Ihre Frage.
Das problem mit löschen und readding die zugehörigen Entitäten, ist, dass es gegen eine foreign key-Einschränkungen, die Sie haben könnte, auf diese untergeordneten Entitäten.
Eine bessere Lösung ist, ändern Laravel ist
HasMany
Beziehung, um einesync
Methode:Können Sie überschreiben Eloquent ist
Model
KlasseHasManySyncable
anstelle des standard -HasMany
Beziehung:Angenommen, dass Ihre
Post
- Modell erweitertMyBaseModel
und hat einelinks()
hasMany
Beziehung, können Sie etwas tun:Alle Datensätze in diesem mehrdimensionalen array, das eine
id
entspricht die untergeordnete Entität Tabelle (links
) aktualisiert werden. Datensätze in der Tabelle, die nicht vorhanden sind, sind in diesem array entfernt werden. Datensätze im array, die nicht in der Tabelle vorhanden (Haben einen nicht passendenid
oder eineid
null) werden als "neue" Rekorde und wird in die Datenbank eingefügt.Ich Tat so, und es ist optimiert für minimale Abfrage und minimale updates:
zuerst link-ids zu synchronisieren, in ein array:
$linkIds
- und dem post-model in eine eigene variable:$post