Créer un script de mise à niveau de Magento 2 pour ajouter / mettre à jour un nouveau champ dans la table de modules personnalisée

10

Quelqu'un a-t-il une idée / suggestion sur la création du script de mise à niveau de Magento 2 (version stable CE) (dans un module personnalisé) pour ajouter / mettre à jour un nouveau champ dans une table personnalisée?

Je connais "InstallSchema" mais y a-t-il quelque chose comme "UpgradeSchema" pour mettre à niveau les tables de modules?

Veuillez expliquer en détail avec des exemples.

Vicky Dev
la source
@Pradeep Kumar Votre réponse a été très utile. Merci pour la longueur d'avance. Ensuite, je suis passé un peu plus profondément à l'intérieur et j'ai découvert que nous devrions utiliser la méthode <i><b>changeColumn</b> </i> pendant que nous modifions le nom de la colonne ou le nom et la définition. Et nous devons utiliser <i><b>modifyColumn</b> </i> pour changer la définition de la colonne. Plus de détails sur <i> Magento \ Framework \ DB \ Adapter \ AdapterInterface </i> Exemple sur <i> Magento \ SalesRule \ Setup \ UpgradeSchema </i> Merci
Sandipan S

Réponses:

28

créer app\code\Sugarcode\Test\Setup\UpgradeSchema.phpet exécuter une commande de mise à niveau

chaque fois que la version a été changée, il suffit de changer dans module.xml et dans UpgradeSchema.php en ajouter une de plus si condition avec comparaison de version

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

            // Changes here.
        }

donc lorsque vous exécutez la commande de mise à niveau, il exécutera le UpgradeSchema.phpfichier et en ce qu'il comparera la version basée sur cette version, il exécutera le code

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 cela fonctionne, acceptez la réponse en cliquant sur le symbole de droite

Pradeep Kumar
la source
1
@ pradeep-kumar Le commentaire de la colonne est l'endroit où addColumn et changeColumn attendent le nom du schéma. public function addColumn($tableName, $columnName, $definition, $schemaName = null);. Vous pouvez mettre le commentaire «Mis à jour à» dans le tableau $ definition comme ['comment' => 'Updated At'].
Anton Evers
@Pradeep, Ma version est "1.0.0", donc si (version_compare ($ context-> getVersion (), '1.0.0', '<')) {} maintenant cela fonctionnera ou non?
jafar pinjar
quelle est l'ancienne version, si l'ancienne version est inférieure à 1.0.0 alors cela fonctionne
Pradeep Kumar