创建Magento 2升级脚本以将新字段添加/更新到自定义模块表中


10

是否有人对创建Magento 2(CE稳定版)升级脚本(在自定义模块中)有任何想法/建议,以在自定义表中添加/更新新字段?

我知道“ InstallSchema”,但是是否有类似“ UpgradeSchema”的东西来升级模块表?

请举例详细说明。


@Pradeep Kumar您的回答非常有帮助。感谢您的领先。接下来,我对内部进行了更深入的研究,发现在更改列名或名称和定义的同时,我们应该使用<i> <b> changeColumn </ b> </ i>方法。并且我们应该使用<i> <b> modifyColumn </ b> </ i>更改列的定义。<i> Magento \ Framework \ DB \ Adapter \ AdapterInterface </ i>的更多详细信息<i> Magento \ SalesRule \ Setup \ UpgradeSchema </ i>的
示例

Answers:


28

创建一个app\code\Sugarcode\Test\Setup\UpgradeSchema.php并运行升级命令

当版本发生更改时,只需在module.xml中进行更改,如果条件与版本比较,则在UpgradeSchema.php中再添加一个

if (version_compare($context->getVersion(), '2.0.1', '<')) {

            // Changes here.
        }

因此,当您运行upgrade命令时,它将运行UpgradeSchema.php文件,并根据该版本比较版本,然后执行代码

<?php

namespace Sugarcode\Test\Setup;

use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\DB\Ddl\Table;

class UpgradeSchema implements UpgradeSchemaInterface
{
    public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();
         $tableName = $setup->getTable('testtable');
        if (version_compare($context->getVersion(), '2.0.0') < 0) {
            // Changes here.
        }

        if (version_compare($context->getVersion(), '2.0.1', '<')) {

            // Changes here.
        }
        if (version_compare($context->getVersion(), '2.0.2', '<')) {
              if ($setup->getConnection()->isTableExists($tableName) == true) {
                $connection = $setup->getConnection();
                /* $connection->addColumn(
                    $tableName,
                    'updated_at',
                    ['type' => Table::TYPE_DATETIME,'nullable' => false, 'default' => '', 'afters' => 'created_at'],
                    'Updated At'
                ); */
                $connection->changeColumn(
                    $tableName,
                    'summary',
                    'short_summary',
                    ['type' => Table::TYPE_TEXT, 'nullable' => false, 'default' => ''],
                    'Short Summary'
                );
                // Changes here.
            }
        }


        $setup->endSetup();

    }
}

module.xml

<?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
        <module name="Sugarcode_Test" setup_version="2.0.2" schema_version="2.0.2" />
    </config>

如果可行,请通过单击右符号来接受答案


1
@ pradeep-kumar列注释是addColumn和changeColumn期望模式名称的地方。 public function addColumn($tableName, $columnName, $definition, $schemaName = null);。您可以在$ definition数组中添加注释'Updated At',例如['comment' => 'Updated At']
安东·埃弗斯,2016年

@Pradeep,我的版本是“ 1.0.0”,所以如果(version_compare($ context-> getVersion(),'1.0.0','<')){}现在可以正常工作吗?
贾法尔·品哈尔(Jafar Pinjar),

什么是旧版本,如果旧版本小于1.0.0,那么它可以工作
Pradeep Kumar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.