ID-Handling beim Anlegen von Produkten via Plugin

Hallo zusammen ,

ich bin gerade dabei über mein Plugin ein Produkt anzulegen. Diese Produkt benötigt allerdings  noch eine Zuordnung zu meiner erstellten Custom Entity. Das Anlegen einer Custom Entity (hier : einem Car)  wird vor dem Anlegen des Produkts durchgeführt.  Wenn ich das richtig “verstanden” habe , dann reicht es ja aus, die passende ID des Eintrags meiner Custom Entity dem Produkt in der Upsert Methode mit zu übergeben und dann dürfte Shopwre den Rest erledigen?

Soabald ich aber über meinen unten aufgezeigten Weg versuche die IDs zu "erstellen / vergeben wird eine                                                                                                                                                                                                                         
  SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row:  … id_car -Exception der Mapping-Tabelle geworfen.

 

Wie vergebe ich hier die IDs bzw. wie muss denn die Zuordnung korrekt aussehen, damit ich meine Zuordnung hinbekomme?

Car und Produkt stehen in einer M:N-Relation “zueinander” und ist dem Bundle-Example nachempfunden.

Das habe ich hier in der “Activate” -Methode meines Plugins (Testweise):

// Einfügen eines Eintrags in der Custom Entity "Car"

     /** @var EntityRepositoryInterface $CarRepository */
        $CarRepository = $this->container->get('custom_car.repository');


        $carID = Uuid::randomHex();

        $CarRepository->create((
        [
            [
                "id" => $carID,
                "manufacturer" => "Audi",
                //... complete definition
            ]

        ]
        ), $activateContext->getContext());



//Einfügen des Produkts



        $productID = Uuid::randomHex();

        $productRepository = $this->container->get('product.repository');
        $productRepository->upsert([
            [
                'id' => $productID,
                'product_version_id'=>$activateContext->getContext()->getVersionId(),
                "name" => "Produkt1",
                'price' => [['currencyId' => Defaults::CURRENCY, 'gross' => 15, 'net' => 10, 'linked' => false]],
                'manufacturer' => ['name' => 'Hersteller1'],
                'tax' => ['name' => '19%', 'taxRate' => 19],
                'stock' => 2222,
                'productNumber' => "ABDSE",
              
                'cars' => [['id_car'=>$carID]]
            ]

        ],
            $activateContext->getContext()
        );

Für Hilfe bin ich sehr Dankbar!!

 

push

push

Die einzige Lösung die mir einfällt (unschön…) ist über ein Criteria() die id zu erhalten und per patch die Zuordnung zu machen… Mir gefällt dieser Ansatz nur nicht da es redundant ist.

Öhmmm… die IDs sind nicht umsonst GUIDs.
Erstell dir einfach eine. Die kannste jederzeit aus dem Hut zaubern.
Und dann beim anlegen des Produktes mitgeben.

Dadurch dass GUIDs absolut eindeutig sind besteht keine Gefahr dass du hier was doppelt erzeugst oder gar eine vorhandene GUID bekommst.

1 Like

Oh stimmt, super Idee. Jetzt muss ich nur mal blöd fragen weil ich noch nicht so fit mit der Thematik bin. Wie kann man die Guid nachträglich wieder erhalten (z.b. einen Tag später)? Bei produkten gibt es ja leider nicht die Methode getId(). Ich würde gerne einen Abgleich machen zwischen Produkten die bereits angelegt wurden und die die noch angelegt werden müssen.
Guids im Array speichern und Cachen? Vermutlich unsicher?

Naja, jede Suche über die API liefert dir natürlich auch die ID.
Aber die ID ändert sich nicht, das heißt das lokal speichern ist durchaus eine valide Idee, meiner Meinung nach.