# Daten lesen von entity extension

**URL:** <https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808>\
**Category:** Administration\
**Tags:** administration\
**Created:** [13. Juni 2022 um 09:41 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808 "2022-06-13T09:41:10Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![rammi22](https://avatars.discourse-cdn.com/v4/letter/r/258eb7/32.png) [@rammi22](https://forum.shopware.com/u/rammi22)\
**Post date:** [13. Juni 2022 um 09:41 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/1 "2022-06-13T09:41:10Z")

</div>

Hallo,

ich habe das [Produkt-Objekt erweitert (lt. Handbuch)](https://developer.shopware.com/docs/guides/plugins/plugins/framework/data-handling/add-complex-data-to-existing-entities).  
Schreiben ins neue Feld funktioniert mit dem [SQL-Codeschnipsel](https://developer.shopware.com/docs/guides/plugins/plugins/framework/data-handling/add-complex-data-to-existing-entities#writing-into-the-new-field).

Mit folgender SQL-Anweisung hole ich mir das Produkt:

```auto
...
$product = $this->productRepository
            ->search(
                new Criteria([$idMainProduct]),
                $context
            )
            ->first();
...

```

Wie kann ich **vom Objekt `$product` die _Daten der Erweiterung_ lesen?**

VG

---

<div class="post-metadata">

**Author:** ![Max\_Shop](https://avatars.discourse-cdn.com/v4/letter/m/58f4c7/32.png) [@Max\_Shop](https://forum.shopware.com/u/Max_Shop)\
**Post date:** [13. Juni 2022 um 10:22 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/2 "2022-06-13T10:22:28Z")

</div>

Nur so am Rande, damit es nicht zu sprachlichen Verwirrungen kommt: das ist keine SQL-Anweisung, das ist ein PHP-Objekt.

> <https://github.com/shopware/platform/blob/ba2f87d5413ffac3ee0489e3dcf999a359d7b3a3/src/Core/Framework/Struct/ExtendableTrait.php>

Es müsste $product-\>getExtensions() sein.

---

<div class="post-metadata">

**Author:** ![rammi22](https://avatars.discourse-cdn.com/v4/letter/r/258eb7/32.png) [@rammi22](https://forum.shopware.com/u/rammi22)\
**Post date:** [13. Juni 2022 um 13:58 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/3 "2022-06-13T13:58:14Z")

</div>

Hi,  
@Max_Shop danke für deine Antwort und auch zum Hinweis des Wording.

Die richtige Methode heißt `getExtension(%myExtension%)` .

Aber ich habe weiterhin Probleme, ich habe einen Datensatz gespeichert:

 ![Bildschirmfoto vom 2022-06-13 15-27-32](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/3X/c/9/c9909b3a891d7691930a9efde2d4374db2227496.png)  
Dieser wurde mit folgenden Code eingefügt:

```auto
...
$this->productRepository
     ->upsert([[
         'id' => $idMainProduct,
         'components' => [
               'components' => $idProductComponent
         ]
]], $context);
....

```

Auslesen tu ich den Datensatz mit o.g. Anweisung:

```auto
$product = $this->productRepository
            ->search(
                new Criteria([$idMainProduct]),
                $context
            )
            ->first();

```

Dann mit `$product->getExtension('components')` bekomme ich _ein Objekt meiner Klasse(?)_…  
leider verstehe [die Annotation](https://github.com/shopware/platform/blob/ba2f87d5413ffac3ee0489e3dcf999a359d7b3a3/src/Core/Framework/Struct/ExtendableTrait.php#L56) nicht:

> Returns a single extension struct element of this class

Deutsch

> Gibt ein einzelnes Erweiterungsstrukturelement _(\<— ???)_ dieser Klasse zurück

…meint? Hab ich nun ein Objekt meiner Klasse?

Wie auch immer, der dump zeigt die ein objekt der ExtensionEntity-Klasse:

```auto
...
object(ProductComposer\Extension\ProductComponentEntity)#2179 (12) {
  ["components":"ProductComposer\Extension\ProductComponentEntity":private]=>
  array(0) { *<========================= leer?*
  }
  ["_uniqueIdentifier":protected]=>
  string(32) "3d1e39d16c1341c8b7cb9c514ff4c8b0"
  ["versionId":protected]=>
  NULL
  ["translated":protected]=>
  array(0) {
  }
  ["createdAt":protected]=>
  object(DateTimeImmutable)#2198 (3) {
    ["date"]=>
    string(26) "2022-06-13 13:18:42.084000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
...

```

Die Zugehörige Klasse:

```auto
<?php declare(strict_types=1);

namespace ProductComposer\Extension;

use Shopware\Core\Framework\DataAbstractionLayer\Entity;
use Shopware\Core\Framework\DataAbstractionLayer\EntityIdTrait;

class ProductComponentEntity extends Entity
{
    use EntityIdTrait;

    private array $components = [];

    /**
     * @return array
     */
    public function getComponents(): array
    {
        return $this->components;
    }

    /**
     * @param string $idComponent
     */
    public function addComponent(string $idComponent): void
    {
        $this->components[] = $idComponent;
    }

}

```

**Und hier meinProblem** : die Eigenschaft `components` bleibt leer? Warum?

---

<div class="post-metadata">

**Author:** ![Max\_Shop](https://avatars.discourse-cdn.com/v4/letter/m/58f4c7/32.png) [@Max\_Shop](https://forum.shopware.com/u/Max_Shop)\
**Post date:** [13. Juni 2022 um 14:43 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/4 "2022-06-13T14:43:45Z")

</div>

Die Property $components ist private. In einem print\_r bekommst du keine privat Werte. Da musst du per $product-\>getExtension(‚components‘)-\>getComponents() darauf zugreifen.

---

<div class="post-metadata">

**Author:** ![rammi22](https://avatars.discourse-cdn.com/v4/letter/r/258eb7/32.png) [@rammi22](https://forum.shopware.com/u/rammi22)\
**Post date:** [13. Juni 2022 um 15:07 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/5 "2022-06-13T15:07:54Z")

</div>

`$product->getExtension('components')->getComponents()` ja, das ist klar.  
Aber da ja die Variable leer ist, zeigt die Methode genau was sie soll:

```auto
array(0) {
}

```

**Die Frage ist, warum wird die Spalte `product_component.components` nicht ausgelesen oder warum liefert die Abfrage nichts?**

Btw, ich such gerade die Möglichkeit des debuggen meines requesst. Eben zu schauen, was an die DB übergeben wird bzw was zurückkommt.  
Ich nutze die Docker-Umgebung zum entwickeln. So wie ich das sehe, ist da kein xdebug vorinstalliert. Gibt es dazu irgend eine Doku?

---

<div class="post-metadata">

**Author:** ![Max\_Shop](https://avatars.discourse-cdn.com/v4/letter/m/58f4c7/32.png) [@Max\_Shop](https://forum.shopware.com/u/Max_Shop)\
**Post date:** [13. Juni 2022 um 16:06 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/6 "2022-06-13T16:06:30Z")

</div>

Wie hast du die Extension angelegt? Das sie nachgeladen werden muss oder immer geladen werden soll? Oder trifft das nur auf Assoziationen zu, bin mir gerade nicht ganz sicher.

---

<div class="post-metadata">

**Author:** ![rammi22](https://avatars.discourse-cdn.com/v4/letter/r/258eb7/32.png) [@rammi22](https://forum.shopware.com/u/rammi22)\
**Post date:** [13. Juni 2022 um 17:25 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/7 "2022-06-13T17:25:10Z")

</div>

> Wie hast du die Extension angelegt?

@Max_Shop Was meinst du damit? Ich habe das Teil [mit dem Handbuch erstellt](https://developer.shopware.com/docs/guides/plugins/plugins/framework/data-handling/add-complex-data-to-existing-entities).

> Das sie nachgeladen werden muss oder immer geladen werden soll?

Mmmh, verstehe ich auch nicht den Gedanken. Die Extension ist ein Service, also demnach immer geladen denke ich:

```auto
<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <service id="ProductComposer\Extension\ProductComponentExtension">
            <tag name="shopware.entity.extension"/>
        </service>
        <service id="ProductComposer\Extension\ProductComponentExtensionDefinition">
            <tag name="shopware.entity.definition" entity="product_component_extension" />
        </service>
        <service id="ProductComposer\Controller\ProductComponentController" public="true">
            <argument type="service" id="product.repository"/>
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
        </service>
    </services>
</container>

```

Außerdem, das Objekt ist ja nicht gänzlich leer, sondern nur die `components` kommen nicht an

---

<div class="post-metadata">

**Author:** ![Max\_Shop](https://avatars.discourse-cdn.com/v4/letter/m/58f4c7/32.png) [@Max\_Shop](https://forum.shopware.com/u/Max_Shop)\
**Post date:** [14. Juni 2022 um 10:46 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/8 "2022-06-14T10:46:14Z")

</div>

Assoziationen können so angelegt werden, dass sie entweder immer mit dem Objekt geladen werden oder aktiv nachgeladen werden müssen. Ich weiß nicht, ob es bei Extension das gleiche ist. Müsstest du mal nachlesen.

---

<div class="post-metadata">

**Author:** ![rammi22](https://avatars.discourse-cdn.com/v4/letter/r/258eb7/32.png) [@rammi22](https://forum.shopware.com/u/rammi22)\
**Post date:** [14. Juni 2022 um 11:12 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/9 "2022-06-14T11:12:42Z")

</div>

> Assoziationen … oder aktiv nachgeladen werden müssen.

@Max_Shop Ok, also die [Konfiguration zum _Nachladen_ **oder** _mit dem Objekt geladen_](https://developer.shopware.com/docs/guides/plugins/plugins/framework/data-handling/add-complex-data-to-existing-entities#adding-a-field-with-database) steht auf true:

```auto
// ProductComponentExtension.php
...
class ProductComponentExtension extends EntityExtension
{
    public function extendFields(FieldCollection $collection): void
    {
        $collection->add(
            new OneToOneAssociationField(
                'components',
                'id',
                'product_id',
                ProductComponentExtensionDefinition::class,
                true <========= association should always be loaded by default 
            )
        );
    }

    public function getDefinitionClass(): string
    {
        return ProductDefinition::class;
    }
}
...

```

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [14. Juni 2022 um 12:57 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/10 "2022-06-14T12:57:07Z")

</div>

Welche Datensätze stehen denn in der Tabelle product\_component\_extension?

---

<div class="post-metadata">

**Author:** ![rammi22](https://avatars.discourse-cdn.com/v4/letter/r/258eb7/32.png) [@rammi22](https://forum.shopware.com/u/rammi22)\
**Post date:** [14. Juni 2022 um 13:45 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/11 "2022-06-14T13:45:43Z")

</div>

@abdullah Woher holst du den Namen (`product_component_extension`) der Tabelle, hab ich da etwas übersehen? Die Tabelle heißt `product_component`…

Die angefragten Daten stehen oben in [meiner Antwort](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/3)

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [14. Juni 2022 um 14:28 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/12 "2022-06-14T14:28:22Z")

</div>

@rammi22 Im Service ist bei der Definition die Entity mit product\_component\_extension angegeben. Daher der Name der Tabelle.

Ich weiß jetzt nicht, wie du die Entity, Definition und die Migration usw. jeweils angelegt hast. Kann sein, dass hier ein Fehler noch vorhanden ist.

---

<div class="post-metadata">

**Author:** ![rammi22](https://avatars.discourse-cdn.com/v4/letter/r/258eb7/32.png) [@rammi22](https://forum.shopware.com/u/rammi22)\
**Post date:** [14. Juni 2022 um 15:06 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/13 "2022-06-14T15:06:38Z")

</div>

> Kann sein, dass hier ein Fehler noch vorhanden ist

@abdullah ja, das schließe ich ja nicht aus. Ich habe den Wert der Entity geändert:

```auto
<service id="ProductComposer\Extension\ProductComponentExtensionDefinition">
            <tag name="shopware.entity.definition" entity="product_component" />
        </service>

```

…das Verhalten hat sich dennoch nicht geändert.

Ich habe das SQL-Statement debuggt, die entscheidene Stelle:

```auto
SELECT
...
`product.components`.`id` as `product.components.id`, `product.components`.`product_id` as `product.components.productId`, `product.components`.`components` as `product.components.components`, `product.components`.`created_at` as `product.components.createdAt`, `product.components`.`updated_at` as `product.components.updatedAt`,
...
LEFT JOIN `product_component` `product.components` ON `product`.`id` = `product.components`.`product_id` WHERE (`product`.`version_id` = :version) AND (`product`.`id` IN (:ids))

```

Ich erkenne nicht, **warum `product_component`.`components` nicht mitgeliefert wird**. Das Feld `product_component`.`createtAt` wird doch auch ausgelesen. Erkennbar im var\_dump von `$product->getExtension('components')`:

```auto
/app/custom/plugins/ProductComposer/src/Controller/ProductComponentController.php:111:
object(ProductComposer\Extension\ProductComponentEntity)[2179]
  private array 'components' => 
    array (size=0)
      empty
  protected '_uniqueIdentifier' => string '3d1e39d16c1341c8b7cb9c514ff4c8b0' (length=32)
  protected 'versionId' => null
  protected 'translated' => 
    array (size=0)
      empty
  protected 'createdAt' => 
    object(DateTimeImmutable)[2185]
      public 'date' => string '2022-06-13 13:20:42.084000' (length=26)
      public 'timezone_type' => int 3
      public 'timezone' => string 'UTC' (length=3)
  protected 'updatedAt' => null
  private '_entityName' (Shopware\Core\Framework\DataAbstractionLayer\Entity) => string 'product_component' (length=17)
  private ?Shopware\Core\Framework\DataAbstractionLayer\FieldVisibility '_fieldVisibility' (Shopware\Core\Framework\DataAbstractionLayer\Entity) => 
    object(Shopware\Core\Framework\DataAbstractionLayer\FieldVisibility)[2181]
      private array 'internalProperties' => 
        array (size=0)
          empty
  protected 'extensions' => 
    array (size=2)
      'foreignKeys' => 
        object(Shopware\Core\Framework\Struct\ArrayStruct)[2177]
          protected 'data' => 
            array (size=0)
              empty
          protected 'apiAlias' => null
          protected 'extensions' => 
            array (size=0)
              empty
      'internal_mapping_storage' => 
        object(Shopware\Core\Framework\Struct\ArrayStruct)[2180]
          protected 'data' => 
            array (size=0)
              empty
          protected 'apiAlias' => null
          protected 'extensions' => 
            array (size=0)
              empty
  protected 'id' => string '3d1e39d16c1341c8b7cb9c514ff4c8b0' (length=32)
  public 'productId' => string 'ac0456e2c692430691240c8d4d831e12' (length=32)
  public 'product' => null

```

---

<div class="post-metadata">

**Author:** ![rammi22](https://avatars.discourse-cdn.com/v4/letter/r/258eb7/32.png) [@rammi22](https://forum.shopware.com/u/rammi22)\
**Post date:** [14. Juni 2022 um 15:42 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/14 "2022-06-14T15:42:43Z")

</div>

Zumindest ausgelesen wird das Feld ([debug breakpoint $row](https://github.com/shopware/platform/blob/19a9d96424500102cc97e6df07923e2a89c08d7d/src/Core/Framework/DataAbstractionLayer/Dbal/EntityReader.php#L134)):

```auto
0 = {array} [93]
...
 product.components.components = "["123abc", "832c27bc5cf64ef1aba549ea38df953c", "test"]"
...

```

Also irgendwie beim Füllen des Objekt läuft was falsch…

---

<div class="post-metadata">

**Author:** ![rammi22](https://avatars.discourse-cdn.com/v4/letter/r/258eb7/32.png) [@rammi22](https://forum.shopware.com/u/rammi22)\
**Post date:** [14. Juni 2022 um 16:59 UTC](https://forum.shopware.com/t/daten-lesen-von-entity-extension/94808/15 "2022-06-14T16:59:11Z")

</div>

Ok, finally…

In der `ProductComponentEntity` war die Eigenschaft `$components` als `private` deklariert.

Richtig ist, und so auch im Handbuch beschrieben, die Eigenschaft muß `protected ` sein.

```auto
...
class ProductComponentEntity extends Entity
{
    use EntityIdTrait;

    protected array $components = [];

    ...
}
...

```

VG
