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')
Ожидаемый результат: Я хотел сохранить свой пользовательский атрибут чужого продукта при сохранении одного продукта.
Пожалуйста, помогите мне. Я пытаюсь исправить это за пару часов, но не решил. Пожалуйста, направь меня.
1 answers
Используйте метод saveAttribute() для сохранения пользовательского атрибута
$productRepository=$objectManager->get('\Magento\Catalog\Api\ProductRepositoryInterface');
$product =$productRepository->getById($mypro);
$product->setBestPrice(0);
$product->getResource()->saveAttribute($product, 'best_price');
Примечание: Код Протестирован