Створіть сценарій оновлення Magento 2, щоб додати / оновити нове поле в таблицю спеціального модуля


10

Хтось має ідею / пропозицію щодо створення Magento 2 (версія стабільної версії CE) Скрипт оновлення (у спеціальному модулі) для додавання / оновлення нового поля у користувальницьку таблицю?

Я знаю про "InstallSchema", але чи є щось на зразок "UpgradeSchema" для оновлення таблиць модулів?

Будь ласка, поясніть детально приклади.


@Pradeep Kumar Ваша відповідь була дуже корисною. Дякую за головний старт Далі я пройшов трохи глибше всередині і виявив, що нам слід використовувати метод <i><b>changeColumn</b> </i>, коли ми змінюємо ім'я стовпця або ім'я та визначення обох. І ми повинні використовувати <i><b>modifyColumn</b> </i> для зміни визначення стовпця. Детальніше на <i> Magento \ Framework \ DB \ Adapter \ AdapterInterface </i> Приклад на <i> Magento \ SalesRule \ Setup \ UpgradeSchema </i> Спасибі
Sandipan S

Відповіді:


28

створити app\code\Sugarcode\Test\Setup\UpgradeSchema.phpкоманду оновлення та запустити її

коли коли-небудь версію було змінено просто змініть модуль.xml та UpgradeSchema.php додайте ще одну, якщо умова з версією порівняти

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

            // Changes here.
        }

тож коли ви запустите команду оновлення, вона запустить UpgradeSchema.phpфайл і порівнятиме версію на основі цієї версії, він виконає код

колишній

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

якщо він працює, прийміть відповідь, натиснувши правий символ


1
@ pradeep-kumar У коментарі стовпця є те, де addColumn та changeColumn очікують назви схеми. public function addColumn($tableName, $columnName, $definition, $schemaName = null);. Ви можете помістити коментар "Оновлений при" в масив $ definition, як ['comment' => 'Updated At'].
Антон Еверс

@Pradeep, моя версія "1.0.0", тож якщо (version_compare ($ контекст-> getVersion (), '1.0.0', '<')) {} тепер вона буде працювати чи ні?
jafar pinjar

що є старішою версією, якщо старша версія менше
Pradeep Kumar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.