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.


@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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.