Utwórz skrypt aktualizacji Magento 2, aby dodać / zaktualizować nowe pole do niestandardowej tabeli modułów


10

Czy ktoś ma pomysł / sugestię dotyczącą tworzenia Magento 2 (wersja stabilna CE) Skrypt aktualizacji (w module niestandardowym) do dodawania / aktualizowania nowego pola w niestandardowej tabeli?

Wiem o „InstallSchema”, ale czy istnieje coś takiego jak „UpgradeSchema” do aktualizacji tabel modułów?

Proszę szczegółowo wyjaśnić za pomocą przykładów.


@Pradeep Kumar Twoja odpowiedź była bardzo pomocna. Dzięki za przewagę. Następnie zagłębiłem się nieco głębiej i odkryłem, że powinniśmy użyć metody <i><b>changeColumn</b> </i>, zmieniając jednocześnie nazwę kolumny lub nazwę i definicję. I powinniśmy użyć <i><b>modifyColumn</b> </i>, aby zmienić definicję kolumny. Więcej szczegółów na <i> Magento \ Framework \ DB \ Adapter \ AdapterInterface </i> Przykład na <i> Magento \ SalesRule \ Setup \ UpgradeSchema </i> Dzięki
Sandipan S

Odpowiedzi:


28

utwórz app\code\Sugarcode\Test\Setup\UpgradeSchema.phpi uruchom polecenie aktualizacji

kiedy kiedykolwiek zmieniano wersję, po prostu zmień w module.xml i w UpgradeSchema.php dodaj jeszcze jeden, jeśli warunek z wersją do porównania

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

            // Changes here.
        }

więc po uruchomieniu polecenia upgrade uruchomi UpgradeSchema.phpplik, a następnie porówna wersję na podstawie tej wersji, wykona kod

dawny

<?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>

jeśli to działa, zaakceptuj odpowiedź, klikając prawy symbol


1
@ pradeep-kumar Komentarz do kolumny to miejsce, w którym addColumn i changeColumn oczekują nazwy schematu. public function addColumn($tableName, $columnName, $definition, $schemaName = null);. Możesz umieścić komentarz „Zaktualizowany w” w tablicy definicji $ jak ['comment' => 'Updated At'].
Anton Evers

@ Pradeep, Moja wersja to „1.0.0”, więc jeśli (version_compare ($ context-> getVersion (), „1.0.0”, „<')) {} teraz będzie działać, czy nie?
jafar pinjar

jaka jest starsza wersja, jeśli starsza wersja jest mniejsza niż 1.0.0, to działa
Pradeep Kumar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.