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.


@ 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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.