Индекс инвентаризации Magento 2.3 показывает, что запрошенный продукт не существует. Проверьте продукт и повторите попытку
Индекс запасов не переиндексируется, он выдает следующее сообщение:
Запрошенный продукт не существует. Проверьте продукт и повторите попытку.
В других вопросах я обнаружил, что могут быть продукты без артикула, но в моей базе данных их нет.
Я прочитал здесь , что процесс повторной индексации генерирует таблицу с виртуальными запасами на основе (среди прочего) количества из назначенных запасов. Теперь я нашел что в моем источнике инвентаря (источник по умолчанию) есть артикулы для товаров, которые я удалил, поэтому продукты с этими артикулами не существуют. Может ли это вызвать эту проблему?
Если это вызывает проблему, что я должен удалить/обновить? Я не знаю, в какой таблице хранится этот инвентарь. Или если есть какие-либо другие источники/таблицы, которые нуждаются в удалении этих элементов.
2 answers
Недавно мы тоже столкнулись с этой проблемой. Решением в нашем случае было убедиться, что таблица inventory_source_item
MySQL не содержит несуществующих артикулов. Чтобы найти поврежденные записи в указанной таблице, попробуйте выполнить следующий запрос MySQL:
SELECT isi.* FROM inventory_source_item isi LEFT JOIN catalog_product_entity cpe ON isi.sku = cpe.sku WHERE cpe.sku IS NULL;
При удалении результирующих строк индексатор запасов снова заработал.
Похоже, что внешний ключ в SKU (в таблице inventory_source_item
, указывающий на catalog_product_entity
) отсутствует. Не уверен, что такой ключ отсутствует специально, но добавление одного с ON DELETE CASCADE
должно предотвратить сообщение об ошибке повторяется. Хотя рекомендуется, чтобы это было подтверждено Magento в связи с проблемой/отчетом на GitHub. На данный момент не удалось найти никаких связанных билетов , поэтому об этом еще предстоит сообщить.
Для меня cataloginventory_stock_item
& quote_item
столы были здесь самыми оскорбительными. Каким-то образом клиенты со старыми тележками смогли оформить заказ на товары, которых не существовало. Я думаю, что-то связанное с их старой миграцией Magento 1 на Magento 2. Я изменил приведенный выше запрос от @Ward следующим образом:
cataloginventory_stock_item
DELETE FROM cataloginventory_stock_item WHERE product_id IN(
SELECT * FROM (
SELECT isi.product_id FROM cataloginventory_stock_item isi
LEFT JOIN catalog_product_entity cpe ON isi.product_id = cpe.entity_id
WHERE cpe.entity_id IS NULL
) AS p
);
quote_item
DELETE FROM quote_item WHERE product_id IN(
SELECT * FROM (
SELECT isi.product_id FROM quote_item isi
LEFT JOIN catalog_product_entity cpe ON isi.product_id = cpe.entity_id
WHERE cpe.entity_id IS NULL
) AS p
);