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アップグレードコマンドを作成して実行する

バージョンが変更されたときは、module.xmlとUpgradeSchema.phpを変更するだけで、バージョン比較の条件を1つ追加してください

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);。次のように、コメント 'Updated At'を$ definition配列に入れることができ['comment' => 'Updated At']ます。
アントンエバーズ2016

@Pradeep、私のバージョンは "1.0.0"なので、(version_compare($ context-> getVersion()、 '1.0.0'、 '<')){}の場合、機能するかどうか
jafar pinjar

古いバージョンは何ですか。古いバージョンが1.0.0未満の場合は機能します
Pradeep Kumar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.