사용자 정의 모듈 테이블에 새 필드를 추가 / 업데이트하기 위해 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에서 버전 비교 조건이있는 경우 하나 더 추가하십시오.

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 배열에 'Updated At'주석을 넣을 수 있습니다 ['comment' => 'Updated At'].
Anton Evers

@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.