Erstellen Sie ein Magento 2-Upgrade-Skript, um ein neues Feld zur benutzerdefinierten Modultabelle hinzuzufügen / zu aktualisieren

10

Hat jemand eine Idee / einen Vorschlag zum Erstellen eines Magento 2-Upgrade-Skripts (CE Stable Version) (im benutzerdefinierten Modul) zum Hinzufügen / Aktualisieren eines neuen Felds zur benutzerdefinierten Tabelle?

Ich kenne "InstallSchema", aber gibt es so etwas wie "UpgradeSchema" zum Aktualisieren der Modultabellen?

Bitte erläutern Sie dies ausführlich anhand von Beispielen.

Vicky Dev
quelle
@ Pradeep Kumar Ihre Antwort war sehr hilfreich. Danke für den Vorsprung. Als nächstes bin ich etwas tiefer gegangen und habe festgestellt, dass wir die <i> <b> changeColumn </ b> </ i> -Methode verwenden sollten, während wir den Spaltennamen oder den Namen und die Definition beider ändern. Und wir sollten <i><b> modifyColumn </ b> </ i> verwenden, um die Definition der Spalte zu ändern. Weitere Details unter <i> Magento \ Framework \ DB \ Adapter \ AdapterInterface </ i> Beispiel unter <i> Magento \ SalesRule \ Setup \ UpgradeSchema </ i> Danke
Sandipan S

Antworten:

28

Erstellen Sie einen app\code\Sugarcode\Test\Setup\UpgradeSchema.phpUpgrade-Befehl und führen Sie ihn aus

Wenn eine Version geändert wurde, ändern Sie einfach die Datei module.xml und fügen Sie in UpgradeSchema.php eine weitere hinzu, wenn die Bedingung mit dem Versionsvergleich übereinstimmt

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

            // Changes here.
        }

Wenn Sie also den Upgrade-Befehl ausführen, wird die UpgradeSchema.phpDatei ausgeführt und die Version basierend auf dieser Version verglichen. Der Code wird ausgeführt

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>

Wenn es funktioniert, akzeptieren Sie die Antwort, indem Sie auf das rechte Symbol klicken

Pradeep Kumar
quelle
1
@ pradeep-kumar Im Spaltenkommentar erwarten addColumn und changeColumn den Schemanamen. public function addColumn($tableName, $columnName, $definition, $schemaName = null);. Sie können den Kommentar 'Updated At' wie folgt in das $ definition-Array einfügen ['comment' => 'Updated At'].
Anton Evers
@Pradeep, meine Version ist "1.0.0". Wenn also (version_compare ($ context-> getVersion (), '1.0.0', '<')) {} jetzt funktioniert oder nicht?
Jafar Pinjar
Was ist die ältere Version, wenn ältere Version kleiner als 1.0.0 ist, dann funktioniert es
Pradeep Kumar