Cree el script de actualización de Magento 2 para agregar / actualizar un nuevo campo en la tabla de módulos personalizados

10

¿Alguien tiene alguna idea / sugerencia sobre la creación de un script de actualización de Magento 2 (versión estable de CE) (en un módulo personalizado) para agregar / actualizar un nuevo campo en una tabla personalizada?

Sé sobre "InstallSchema" pero ¿hay algo como "UpgradeSchema" para actualizar las tablas de módulos?

Por favor explique en detalle con ejemplos.

Vicky Dev
fuente
@Pradeep Kumar Tu respuesta fue muy útil. Gracias por la ventaja. Luego, he profundizado un poco más y descubrí que deberíamos usar el método <i><b>changeColumn</b> </i> mientras cambiamos el nombre de la columna o el nombre y la definición de ambos. Y debemos usar <i><b>modifyColumn</b> </i> para cambiar la definición de columna. Más detalles en <i> Magento \ Framework \ DB \ Adapter \ AdapterInterface </i> Ejemplo en <i> Magento \ SalesRule \ Setup \ UpgradeSchema </i> Gracias
Sandipan S

Respuestas:

28

crear app\code\Sugarcode\Test\Setup\UpgradeSchema.phpy ejecutar el comando de actualización

cuando alguna vez se haya cambiado la versión, simplemente cambie en module.xml y en UpgradeSchema.php agregue uno más si se compara la condición con la versión

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

            // Changes here.
        }

así que cuando ejecute el comando de actualización, ejecutará el UpgradeSchema.phparchivo y, en el sentido de que comparará la versión basada en esa versión, ejecutará el 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>

si funciona, acepte la respuesta haciendo clic en el símbolo derecho

Pradeep Kumar
fuente
1
@ pradeep-kumar El comentario de la columna es donde addColumn y changeColumn esperan el nombre del esquema. public function addColumn($tableName, $columnName, $definition, $schemaName = null);. Puede poner el comentario 'Actualizado en' en la matriz $ definition como ['comment' => 'Updated At'].
Anton Evers
@Pradeep, Mi versión es "1.0.0", entonces si (version_compare ($ context-> getVersion (), '1.0.0', '<')) {} ahora funcionará o no?
jafar pinjar
¿Cuál es la versión anterior? Si la versión anterior es inferior a 1.0.0, entonces funciona
Pradeep Kumar