# Upsert custom fields bei Update Methode - Werte/Values sollen bestehen bleiben

**URL:** <https://forum.shopware.com/t/upsert-custom-fields-bei-update-methode-werte-values-sollen-bestehen-bleiben/85886>\
**Category:** Programmierung\
**Created:** [11. März 2021 um 14:21 UTC](https://forum.shopware.com/t/upsert-custom-fields-bei-update-methode-werte-values-sollen-bestehen-bleiben/85886 "2021-03-11T14:21:35Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![myshoptheme](https://avatars.discourse-cdn.com/v4/letter/m/4da419/32.png) [@myshoptheme](https://forum.shopware.com/u/myshoptheme)\
**Post date:** [11. März 2021 um 14:21 UTC](https://forum.shopware.com/t/upsert-custom-fields-bei-update-methode-werte-values-sollen-bestehen-bleiben/85886/1 "2021-03-11T14:21:35Z")

</div>

Moinsen,

ich habe eine Frage bzgl. der custom fields / Attribute.  
Wir haben in einem Plugin einige Custom Fields, welche nun durch ein Update des Plugins erweitert werden sollen.

**BEISPIEL:**

```
$this->productRepository->upsert([[
'id' => '0a1b1ab305a94debb53d5aedf5349b8c',
'customFields' => ['swag_example_size' => 15, 'swag_example_color' => '#189eff']
]], $context);

```

Vor dem Hintergrund, dass wir eindeutige **ids** und **upsert** verwenden habe ich folgende Frage:

**FRAGE:**  
Wenn wir in der Plugin Update-Methode einfach die kompletten custom fields per upsert-Methode aktualisieren und neue Felder hinzufügen, **bleiben die vom Kunden hinterlegten Werte bestehen**?

Wir führen keine weiteren Checks durch, sondern verlassen uns rein auf die ID und die upsert-Methode.  
Wir haben das bisher in der Entwicklungsumgebung getestet, haben aber Angst, etwas zu übersehen.

Jemand Erfahrung damit? Vielen Dank!

---

<div class="post-metadata">

**Author:** ![gaxweb](https://avatars.discourse-cdn.com/v4/letter/g/ea5d25/32.png) [@gaxweb](https://forum.shopware.com/u/gaxweb)\
**Post date:** [13. Februar 2024 um 09:26 UTC](https://forum.shopware.com/t/upsert-custom-fields-bei-update-methode-werte-values-sollen-bestehen-bleiben/85886/2 "2024-02-13T09:26:05Z")

</div>

Frage mich gerade das gleiche, weil ich mit `update()` gerade den bestehenden Inhalt verloren habe. Funktioniert das mit `upsert()`?

Edit: auch mit `upsert()` scheint es gerade alles rausgeschmissen zu haben. Oder merged es nur auf der obersten Ebene?

---

<div class="post-metadata">

**Author:** ![trade](https://avatars.discourse-cdn.com/v4/letter/t/5fc32e/32.png) [@trade](https://forum.shopware.com/u/trade)\
**Post date:** [13. Februar 2024 um 10:30 UTC](https://forum.shopware.com/t/upsert-custom-fields-bei-update-methode-werte-values-sollen-bestehen-bleiben/85886/3 "2024-02-13T10:30:41Z")

</div>

Wenn du ein update/upsert auf customFields durchführst, dann überschreibst du immer alles

---

<div class="post-metadata">

**Author:** ![gaxweb](https://avatars.discourse-cdn.com/v4/letter/g/ea5d25/32.png) [@gaxweb](https://forum.shopware.com/u/gaxweb)\
**Post date:** [13. Februar 2024 um 10:46 UTC](https://forum.shopware.com/t/upsert-custom-fields-bei-update-methode-werte-values-sollen-bestehen-bleiben/85886/4 "2024-02-13T10:46:57Z")

</div>

Stimmt scheinbar.

Hab aber gerade auf dem Entity die `\Shopware\Core\Framework\DataAbstractionLayer\EntityCustomFieldsTrait::changeCustomFields()` Methode gefunden, die bestehende Einträge beibehält. Das läuft aber nicht rekursiv, gilt also nur für die oberste Ebene.

> Allows to change custom fields.  
> If you pass only one field name, the value of the field will be changed. If you pass multiple field names, an array with the field names as keys and the values as values will be changed.

---

<div class="post-metadata">

**Author:** ![AlexGalax](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/alexgalax/32/9925_2.png) [@AlexGalax](https://forum.shopware.com/u/AlexGalax)\
**Post date:** [14. Februar 2024 um 05:28 UTC](https://forum.shopware.com/t/upsert-custom-fields-bei-update-methode-werte-values-sollen-bestehen-bleiben/85886/5 "2024-02-14T05:28:59Z")

</div>

Upsert beteutet ja nur, das der Artikel neu angelegt wird, falls er nicht existiert.

```auto
function upsert(entity){
    if (entity.id){
        update(entity)
    }else{
        insert(entity)
    }
}

```

Es wird also immer überschrieben, weil du den Artikel ganz normal aktualisiert (ist immer ein update, denn `id` ist ja immer vorhanden). Wäre ja auch schlecht, wenn da Werte einfach ignoriert würden. Entweder du liest den Wert vorher aus und übergibst ihn mit oder du übergibst gleich nur die neuen Custom-Felder, dann werden die alten auch nicht überschrieben.

Aber du kannst das in der `update()`-Methode des Plugins gleich über Sql ändern wie du es brauchst:

```sql
UPDATE product_translation
SET `custom_fields` = JSON_MERGE_PATCH(
    '{"swag_example_size": 15, "swag_example_color": "#189eff"}'
    `custom_fields`, 
)

```

Über `JSON_MERGE_PATCH` wird `custom_fields` auf einen Default-Wert gesetzt und mit den bestehenden Werten gemerget/überschrieben.

Den Artikeln danach einen speziellen Wert zuzuweisen, sollte dann ja über einen Artikel-Import Prozess stattfinden und nicht über eine Plugin-Aktualisierung.

Ist insgesamt performanter und vom Ablauf auch irgendwie logischer.
