전체 제품을 Magento2에 저장하지 않고 특정 속성 값만 저장하는 방법


10

너희들은 이미 우리가 magento에서 아래의 메소드를 사용하여 이와 같은 특정 속성 값을 저장 했음을 알고있다 .

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

또는

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

누구든지 Magento2에서 위대안을 알려주십시오 .

답변:


8

마 젠토 1과 동일

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

이것은 모든 엔티티에서 작동합니다.

@Raphael의 답변 에 따라 판매 속성에는 작동하지 않습니다.

기본적으로 Magento \ Eav \ Model \ Entity \ AbstractEntity :: saveAttribute () 함수를 호출합니다.

이것은 두 가지 매개 변수를 허용합니다

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

첫 번째 $object는 업데이트가 필요한 객체이고 두 번째 매개 변수는 $attributeCode업데이트 할 속성의 코드입니다.


기본적으로 모든 엔티티에 대한 것이어야합니다.
Kingshuk Deb

예, 모든 엔티티에서 작동합니다. 기본적으로 Magento\Eav\Model\Entity\AbstractEntity::saveAttribute()dataobject 및 엔티티 코드를 허용하는 호출 합니다.
Jaimin Sutariya

그것을 반대하지만 지금은 대답으로 받아들이지 않습니다. 확인하고 업데이트하겠습니다.
Kingshuk Deb

파일에서 1608 행으로 이동하십시오. (Magento 2.1.5) 또 다른 기능이 있습니다public function saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)
Jaimin Sutariya

1
magento는 기본적으로 모든 중요한 기능을 그대로 유지 한 것 같습니다.
Kingshuk Deb

4

Jaimin의 답변을 명확히하기 위해 :

이것은 모든 엔티티에서 작동합니다.

사실이 아닙니다. 확장되는 EAV 엔터티에만 작동합니다.Magento\Eav\Model\Entity\AbstractEntity

자원 모델이 확장되는 비 EAV 엔티티를 처리하는 경우 자원 모델 Magento\Framework\Model\ResourceModel\Db\AbstractDb에서 saveAttribute메소드 를 구현 해야합니다.

마 젠토 2에서는 다음과 같이 Magento\Sales\Model\ResourceModel\Attribute수업을 진행했습니다 .

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;
}

3

제품의 경우 대량 작업 개체를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

// 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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.