找不到Magento 2.3升级表

找不到Magento 2.3升级表,magento,magento-2.3,Magento,Magento 2.3,您好,我刚刚将一个项目从magento 2.2.6升级到2.3,在执行设置:升级时遇到此问题 SQLSTATE[42S02]:找不到基表或视图:1146表 “目录\类别\产品\索引\仓库1 \仓库1”不存在,查询 was:插入目录\类别\产品\索引\仓库1 \仓库1 (类别id,产品id,位置,是父项,存储id, 可见性)从 catalog\u category\u product\u index\u store1WHERE(store\u id='1')ON 重复密钥更新category\u

您好,我刚刚将一个项目从magento 2.2.6升级到2.3,在执行设置:升级时遇到此问题

SQLSTATE[42S02]:找不到基表或视图:1146表 “目录\类别\产品\索引\仓库1 \仓库1”不存在,查询 was:插入
目录\类别\产品\索引\仓库1 \仓库1
类别id
产品id
位置
是父项
存储id
可见性
)从
catalog\u category\u product\u index\u store1
WHERE(store\u id='1')ON 重复密钥更新
category\u id
=值(
category\u id
),
产品标识
=值(
产品标识
),
位置
=值(
位置
),
是父项
=值(
是父项
),
存储id
=值(
存储id
),
可见性
=值(
可见性


我找到了根本原因:

有一个插件(Magento\Catalog\Model\Indexer\Category\Product\plugin\TableResolver)正在向$setup->getTable()调用添加_store1后缀。这对于主应用程序来说非常有用,但是$setup->getTable()也在数据迁移过程中使用,数据迁移在第一次创建\u storeX表时运行,我们需要原始表名来运行迁移

我通过覆盖迁移数据修补程序解决了此问题: Magento\Catalog\Setup\Patch\Data\EnableSegmentation.php

请执行以下操作:

  • 为此覆盖创建新模块或使用现有模块。有许多在线创建模块的演练

  • 将Magento\Catalog\Setup\Patch\Data\EnableSegmentation.php复制到模块中的同一路径。因此,如果您的模块位于app\code\Company\PatchFix中,您应该将该文件复制到app\code\Company\PatchFix\Setup\Patch\Data\enableSecgmentation.php

  • 在复制的文件中,更新第7行中的命名空间:

  • 在定义$setup对象之后添加以下代码(第58行附近):
  • 它只是从表名中一次删除一个结束字符,直到它以
    索引
    结束

  • 将以后对
    $setup->getTable('catalog\u category\u product\u index')
    的所有调用替换为
    $catalogCategoryProductIndexTablename

  • 保存您的更改

  • 如果您的模块没有
    etc/di.xml
    文件,请从头创建一个或从另一个模块复制一个。同样,网上也有一些指南向您展示如何做到这一点

  • 向新数据修补程序添加覆盖首选项:

  • 
    
  • 保存etc/di.xml

  • 运行
    安装程序:升级

  • namespace Company\PatchFix\Setup\Patch\Data;
    
            // Get the index table name once
            $catalogCategoryProductIndexTableName = $setup->getTable('catalog_category_product_index');
            // This table name will probably not end with _index, but we need it to for this patch to work
            if (substr($catalogCategoryProductIndexTableName, -5) !== 'index') {
                while (substr($catalogCategoryProductIndexTableName, -5) !== 'index') {
                    $catalogCategoryProductIndexTableName = substr($catalogCategoryProductIndexTableName, 0,
                        strlen($catalogCategoryProductIndexTableName) - 1);
                }
            }
    
        <preference for="Magento\Catalog\Setup\Patch\Data\EnableSegmentation" type="Company\PatchFix\Setup\Patch\Data\EnableSegmentation" />