durch die Migration von shopware 5 zu shopware 6 habe ich einige customFields von alten Plugins an den Produkten hängen, die ich nicht löschen kann.
Ich gebe der shopware API über den /product/id endpoint die Daten für das customFields Feld als JSON-Objekt mit nur den Einträgen die ich behalten will. Leider wird der Eintrag in der Datenbank dann nicht einfach mit dem neuen JSON überschrieben sondern es werden anscheinend die Einträge im JSON-Objekt einzeln evaluiert.
Beim Anlegen und Ändern von Einträgen in customFields funktioniert dann auch alles wunderbar, nur wenn ein Eintrag erstmal in customFields ist, kann ich den nicht mehr löschen.
Das ganze ist dabei dann auch noch vollkommen inkonsistent, denn andere Daten konnte ich löschen indem ich sie in meinem an die API gesendetem JSON-Objekt einfach weg gelassen habe.
Kann mir jemand erklären wie die API entscheidet ob und wann ein Eintrag in den customFields gelöscht wird und wie ich dafür sorgen kann dass nicht mehr benötigte Einträge in customFields auch konsistent bei allen Produkten gelöscht werden?
Feld erst auf NULL setzen und dann nur noch die gewünschten Felder speichern? Nur geraten.
Macht so wie es ist grundsätzlich schon Sinn, denn sonst müsste man im Gegenzug ja immer erst mal den Inhalt des Feldes abrufen, wenn es bei jedem UPDATE immer wie leer behandelt würde. Sonst ginge immer der Inhalt flöten, und in das Feld kann ja weiß Gott wer sein Zeug reinschreiben.
ja deine Lösung hatte ich zwischenzeitlich auch gefunden, wobei ich es auf ein leeres Object setze und dann mit den zwischengespeicherten Daten wieder neu fülle.
Ich muss so aber die API immer zwei mal abrufen, einmal um das Feld leer zu machen und dann mit meinen Daten neu zu schreiben, habe also eine sehr miese Performance. Stört mich zwar nicht denn das kann ja im Hintergrund laufen, ist aber halt nicht gerade best practice. Außerdem habe ich immer das Risiko, dass mein Skript eventuell genau in dem Zwischenschritt, wo ich das leere Object gesetzt habe, abschmiert und mir die zwischengespeicherten Daten verloren gehen. Sprich genau dein Bedenken würde dann eintreffen, nämlich Datenverlust.
Aus meiner Sicht macht es eben genau so Sinn, dass wenn man schon meint Objekte in Datenbankfeldern zu speichern, diese bei einem Upgrade komplett auszutauschen, bei anderen Daten überschreibt man ja auch die vorherigen Einträge, anstatt den bestehenden Eintrag mühselig anzupassen.
Zum Glück muss ich die Daten nur einmalig nach der Migration von shopware 5 zu shopware 6 anpassen, also es wird hoffentlich ohne Datenverlust klappen.
Wie gesagt: stell dir vor 2 Plugins schreiben ihr Zeug in das gleiche custom field. Wenn man immer wieder das komplette Objekt speichern müsste, dann müsste man selbst immer einen Abgleich mit den Inhalten machen, die man selbst gar nicht gesetzt hatte. So wie es ist, muss man das nicht. Was einen nicht betrifft bleibt einfach wie es ist.
Wenn bei dir zwei verschiedene Plugins in das gleiche custom Field schreiben, dann kann ich sehr gut nachvollziehen, dass du lieber nicht wissen willst wie das Objekt aussieht und was damit passiert