Crie o Script de atualização do Magento 2 para adicionar / atualizar novo campo na tabela de módulos personalizados


10

Alguém tem alguma idéia / sugestão sobre a criação do Script de atualização do Magento 2 (versão CE estável) (no módulo personalizado) para adicionar / atualizar novo campo na tabela personalizada?

Conheço o "InstallSchema", mas existe algo como "UpgradeSchema" para atualizar as tabelas de módulos?

Por favor, explique em detalhes com exemplos.


@ Pradeep Kumar Sua resposta foi muito útil. Obrigado pelo início. Em seguida, examinei um pouco mais profundamente e descobri que devemos usar o método <i><b>changeColumn</b> </i> enquanto alteramos o nome da coluna ou o nome e a definição de ambos. E devemos usar <i><b> modifyColumn</b> </i> para alterar a definição da coluna. Mais detalhes em <i> Magento \ Framework \ DB \ Adapter \ AdapterInterface </i> Exemplo em <i> Magento \ SalesRule \ Setup \ UpgradeSchema </i> Obrigado
Sandipan S

Respostas:


28

crie um app\code\Sugarcode\Test\Setup\UpgradeSchema.phpe execute o comando upgrade

sempre que a versão for alterada, basta alterar o module.xml e no UpgradeSchema.php, adicionar mais uma condição se com a versão compare

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

            // Changes here.
        }

portanto, quando você executa o comando upgrade, ele executa o UpgradeSchema.phparquivo e compara a versão com base nessa versão, executa o código

ex

<?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>

se funcionar, aceite a resposta clicando no símbolo da direita


11
@ pradeep-kumar O comentário da coluna é onde addColumn e changeColumn esperam o nome do esquema. public function addColumn($tableName, $columnName, $definition, $schemaName = null);. Você pode colocar o comentário 'Atualizado em' no array $ definition, como ['comment' => 'Updated At'].
Anton Evers

@ Pradeep, minha versão é "1.0.0", então se (version_compare ($ context-> getVersion (), '1.0.0', '<')) {} agora funcionará ou não?
Jafar pinjar

qual é a versão mais antiga, se a versão mais velha é inferior a 1.0.0, em seguida, ele funciona
Pradeep Kumar
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.