Создать скрипт обновления 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.