Magento 2 Обновление других продуктов в каталоге сохранение продукта после наблюдателя событий


Я создал Наблюдателя этого события:catalog_product_save_after Я пытаюсь обновить другие продукты и загрузить их на основе их идентификатора, но это выдает мне ошибку. Я делюсь своим кодом здесь.

Код:-

    $product = $observer->getProduct();
    $productId = $observer->getProduct()->getId();
    $brand = $product->getBrand();
    $model = $product->getModel();

    $collection = $this->_productCollectionFactory->create();
    $collection->addAttributeToSelect('*');
    $collection->addAttributeToFilter('model', $model);
    $collection->addAttributeToFilter('brand', $brand);
    $collection->addAttributeToFilter('visibility', 4);
    $collection->addAttributeToSort('price', 'ASC');

    $i = 0;
    $prodId = [];
    foreach ($collection as $value) {
        if($i != 0) {
            $prodId[] = $value->getId();
        }
        $i++;
    }
    foreach($prodId as $mypro) {
        $productRepository = $this->_objectManager->get('Magento\Catalog\Model\Product')->load($mypro);
        $productRepository->setData('best_price', 0);
        $productRepository->save();
    }

Что Я пробовал: - Сначала я попытался сохранить один продукт без использования цикла foreach, но он также выдал ту же ошибку. Я тоже пытался это сделать, но получил ту же ошибку:-

$i = 0;
foreach ($collection as $value) {
if($i != 0) {
$prodId = $value->getId();
$productRepository = $this->_objectManager->get('Magento\Catalog\Model\Product')->load($prodId);
                $productRepository->setData('best_price', 0);
                $productRepository->save();
}
$i++;
}

Ошибка:

СОСТОЯНИЕ SQLSTATE[HY000]: Общая ошибка: превышено время ожидания блокировки 1205; попробуйте перезапустить транзакцию, запрос был: ОБНОВЛЕНИЕcatalog_product_entity УСТАНОВЛЕНО attribute_set_id = ?, type_id = ?, sku = ?, has_options = ?, required_options = ?, created_at = ?, updated_at = ? ГДЕ (идентификатор сущности = '5263')

Ожидаемый результат: Я хотел сохранить свой пользовательский атрибут чужого продукта при сохранении одного продукта.

Пожалуйста, помогите мне. Я пытаюсь исправить это за пару часов, но не решил. Пожалуйста, направь меня.

Author: temper, 2019-06-21

1 answers

Используйте метод saveAttribute() для сохранения пользовательского атрибута

$productRepository=$objectManager->get('\Magento\Catalog\Api\ProductRepositoryInterface');
$product =$productRepository->getById($mypro);
$product->setBestPrice(0);
$product->getResource()->saveAttribute($product, 'best_price');

Примечание: Код Протестирован

 3
Author: Arunprabakaran M, 2019-07-11 14:05:17