Jak zapisać tylko określoną wartość atrybutu zamiast zapisywać cały produkt w Magento2

10

Jak już wiecie, mieliśmy w Magento tę metodę poniżej, aby zapisać określoną wartość atrybutu taką jak ta.

// saving product attribute
$product = Mage::getModel('catalog/product')->load('id here');
$product->setName('your name here');
$product->getResource()->saveAttribute($product, 'name');

lub

// saving customer attribute
$customer->setData($attrCode, $value)->getResource()->saveAttribute($customer, $attrCode);

Czy ktoś może dać mi znać alternatywę powyższego w Magento2 .

Kingshuk Deb
źródło

Odpowiedzi:

8

Jest taki sam jak Magento 1

$dataobject->setData('attribute_code', $value);
$dataobject->getResource()->saveAttribute($dataobject, 'attribute_code');

Będzie to działać dla każdego podmiotu.

Zgodnie z odpowiedzią @ Raphael To nie będzie działać dla atrybutów sprzedaży.

Zasadniczo wywołuje funkcję Magento \ Eav \ Model \ Entity \ AbstractEntity :: saveAttribute () .

To przyjmie dwa parametry

saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)

Najpierw $objectjest obiekt, który musi zostać zaktualizowany, a drugim parametrem będzie $attributeCodekod aktualizowanego atrybutu.

Jaimin Sutariya
źródło
Powinno to być zasadniczo dla każdego podmiotu.
Kingshuk Deb
Tak, będzie działać dla każdego podmiotu. W zasadzie zadzwoni, Magento\Eav\Model\Entity\AbstractEntity::saveAttribute()co zaakceptuje obiekt danych i kod encji.
Jaimin Sutariya
Głosowanie, ale nie akceptowanie w tej chwili odpowiedzi. Sprawdzę i zaktualizuję.
Kingshuk Deb
Proszę przejść do wiersza 1608 w pliku. (Magento 2.1.5) jest jeszcze jedna funkcjapublic function saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)
Jaimin Sutariya
1
Wygląda na to, że magento zasadniczo zachowało wszystkie ważne funkcje.
Kingshuk Deb
4

Aby wyjaśnić odpowiedź Jaimin:

Będzie to działać dla każdego podmiotu.

To nie jest prawda. Będzie działać tylko dla podmiotów EAV, które rozszerzająMagento\Eav\Model\Entity\AbstractEntity

Jeśli masz do czynienia z podmiotem spoza EAV, w którym rozszerza się model zasobów Magento\Framework\Model\ResourceModel\Db\AbstractDb, będziesz musiał zaimplementować tę saveAttributemetodę w swoim modelu zasobów.

W Magento 2 zrobili to dla Magento\Sales\Model\ResourceModel\Attributeklasy:

public function saveAttribute(AbstractModel $object, $attribute)
{
    if ($attribute instanceof AbstractAttribute) {
        $attributes = $attribute->getAttributeCode();
    } elseif (is_string($attribute)) {
        $attributes = [$attribute];
    } else {
        $attributes = $attribute;
    }
    if (is_array($attributes) && !empty($attributes)) {
        $this->getConnection()->beginTransaction();
        $data = array_intersect_key($object->getData(), array_flip($attributes));
        try {
            $this->_beforeSaveAttribute($object, $attributes);
            if ($object->getId() && !empty($data)) {
                $this->getConnection()->update(
                    $object->getResource()->getMainTable(),
                    $data,
                    [$object->getResource()->getIdFieldName() . '= ?' => (int)$object->getId()]
                );
                $object->addData($data);
            }
            $this->_afterSaveAttribute($object, $attributes);
            $this->getConnection()->commit();
        } catch (\Exception $e) {
            $this->getConnection()->rollBack();
            throw $e;
        }
    }
    return $this;
}
Raphael at Digital Pianism
źródło
3

W przypadku produktu można użyć obiektu akcji masowej. Na przykład:

// Edit
$productIds = [123];
$attributesData = ['name' => 'new product name'];
$storeId = 0;
$productMassAction = \Magento\Framework\App\ObjectManager::getInstance()->get('Magento\Catalog\Model\Product\Action');
$productMassAction->updateAttributes($productIds, $attributesData, $storeId);
MagePsycho
źródło