Cách chỉ lưu giá trị thuộc tính cụ thể thay vì lưu toàn bộ sản phẩm trong Magento2


10

Như các bạn đã biết rằng chúng ta đã từng sử dụng phương thức dưới đây trong magento để lưu một giá trị thuộc tính cụ thể như thế này.

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

hoặc là

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

Bất cứ ai có thể cho tôi biết sự thay thế của ở trên trong Magento2 .

Câu trả lời:


8

Nó giống như Magento 1

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

Điều này sẽ làm việc cho bất kỳ thực thể.

Theo câu trả lời của @ Raphael Nó sẽ không hoạt động cho các thuộc tính bán hàng.

Về cơ bản, nó gọi hàm Magento \ Eav \ Model \ Entity \ AbstractEntity :: saveAttribution () .

Điều này sẽ chấp nhận hai tham số

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

Đầu tiên $objectlà một đối tượng cần được cập nhật và tham số thứ hai sẽ $attributeCodelà mã cho thuộc tính được cập nhật.


Nó nên cơ bản cho bất kỳ thực thể.
Kingshuk Deb

Có nó sẽ làm việc cho bất kỳ thực thể. Về cơ bản Magento\Eav\Model\Entity\AbstractEntity::saveAttribute(), nó sẽ gọi cái nào sẽ chấp nhận một dataobject và mã thực thể.
Jaimin Sutariya

Nâng cao nó nhưng không chấp nhận như một câu trả lời ngay bây giờ. Tôi sẽ kiểm tra và cập nhật.
Kingshuk Deb

Vui lòng đến dòng 1608 trong tập tin. (Magento 2.1.5) có một chức năng khácpublic function saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)
Jaimin Sutariya

1
Có vẻ như magento đã giữ nguyên các chức năng quan trọng.
Kingshuk Deb

4

Chỉ cần làm rõ câu trả lời của Jaimin:

Điều này sẽ làm việc cho bất kỳ thực thể.

Đây không phải là sự thật. Nó sẽ chỉ hoạt động cho các thực thể EAV mở rộngMagento\Eav\Model\Entity\AbstractEntity

Nếu bạn đang làm việc với một thực thể không phải EAV nơi mô hình tài nguyên mở rộng, Magento\Framework\Model\ResourceModel\Db\AbstractDbbạn sẽ phải triển khai saveAttributephương thức trong mô hình tài nguyên của mình.

Trong Magento 2, họ đã thực hiện nó cho Magento\Sales\Model\ResourceModel\Attributelớp:

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

Trong trường hợp sản phẩm, bạn có thể sử dụng đối tượng hành động hàng loạt. Ví dụ:

// 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.