Индекс инвентаризации Magento 2.3 показывает, что запрошенный продукт не существует. Проверьте продукт и повторите попытку


Индекс запасов не переиндексируется, он выдает следующее сообщение:

Запрошенный продукт не существует. Проверьте продукт и повторите попытку.

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

Я прочитал здесь , что процесс повторной индексации генерирует таблицу с виртуальными запасами на основе (среди прочего) количества из назначенных запасов. Теперь я нашел что в моем источнике инвентаря (источник по умолчанию) есть артикулы для товаров, которые я удалил, поэтому продукты с этими артикулами не существуют. Может ли это вызвать эту проблему?

Если это вызывает проблему, что я должен удалить/обновить? Я не знаю, в какой таблице хранится этот инвентарь. Или если есть какие-либо другие источники/таблицы, которые нуждаются в удалении этих элементов.

Author: Kishan Savaliya, 2019-10-19

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. На данный момент не удалось найти никаких связанных билетов , поэтому об этом еще предстоит сообщить.

 4
Author: Ward, 2019-11-09 16:57:38

Для меня 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
);
 0
Author: Chris Rogers, 2020-08-24 01:46:52