Создать скрипт обновления 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> Спасибо
Sandipan S

Ответы:

28

создать app\code\Sugarcode\Test\Setup\UpgradeSchema.phpи запустить команду обновления

когда когда-либо была изменена версия, просто измените в module.xml и в UpgradeSchema.php добавьте еще одно, если условие сравнивается с версией

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

            // Changes here.
        }

поэтому, когда вы запускаете команду обновления, она запускает 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, например ['comment' => 'Updated At'].
Антон Эверс
@Pradeep, Моя версия "1.0.0", так что если (version_compare ($ context-> getVersion (), '1.0.0', '<')) {} теперь это будет работать или нет?
Джафар Пинджар
Что такое более старая версия, если более старая версия меньше, чем 1.0.0, то она работает
Pradeep Kumar