Wenn man in Magento 2 nur einen einzelnen Attributwert eines Produkts benötigt, muss man dafür nicht immer das komplette Produkt über das Repository oder eine Collection laden. Gerade in Schleifen, Cronjobs oder Importen kann das unnötig viel Arbeit verursachen.
Über das Product Resource Model lässt sich ein Attribut direkt anhand von Produkt ID, Attributcode und Store ID auslesen:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
use Magento\Catalog\Model\ResourceModel\Product as ProductResource; public function __construct( private ProductResource $productResource ) { } public function getValue(int $productId, int $storeId): mixed { return $this->productResource->getAttributeRawValue( $productId, 'manufacturer', $storeId ); } |
Magento lädt dabei nicht das komplette Produktmodell mit sämtlichen Attributen, sondern liest gezielt den benötigten Wert. Das kann besonders interessant sein, wenn innerhalb einer größeren Verarbeitung für viele Produkte nur ein einzelnes Attribut benötigt wird.
Bei einem Dropdown Attribut wie manufacturer gibt getAttributeRawValue() allerdings die gespeicherte Option ID zurück und nicht deren sichtbare Bezeichnung. Soll zusätzlich der eigentliche Wert des Dropdowns ermittelt werden, kann die Option über die Attribut Source aufgelöst werden:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
use Magento\Catalog\Model\ResourceModel\Product as ProductResource; use Magento\Eav\Model\Config as EavConfig; public function __construct( private ProductResource $productResource, private EavConfig $eavConfig ) { } public function getManufacturerLabel( int $productId, int $storeId ): ?string { $optionId = $this->productResource->getAttributeRawValue( $productId, 'manufacturer', $storeId ); if (!$optionId) { return null; } $attribute = $this->eavConfig->getAttribute( 'catalog_product', 'manufacturer' ); $attribute->setStoreId($storeId); return $attribute->getSource()->getOptionText($optionId); } |
Aus einer gespeicherten Option ID wie 42 wird damit beispielsweise die sichtbare Bezeichnung Bosch. Durch die Store ID wird dabei auch berücksichtigt, dass ein Attributwert oder die Bezeichnung einer Option je nach Store View unterschiedlich sein kann.