Tạo Tập lệnh Nâng cấp Magento 2 để thêm / cập nhật trường mới vào bảng mô-đun tùy chỉnh


10

Bất cứ ai cũng có bất kỳ ý tưởng / đề xuất nào về việc tạo Magento 2 (phiên bản ổn định CE) Tập lệnh nâng cấp (trong mô-đun tùy chỉnh) để thêm / cập nhật trường mới vào bảng tùy chỉnh?

Tôi biết về "InstallSchema" nhưng có cái gì đó như "Nâng cấpSchema" để nâng cấp các bảng mô-đun không?

Hãy giải thích chi tiết với các ví dụ.


@Pradeep Kumar Câu trả lời của bạn rất hữu ích. Cảm ơn cho sự khởi đầu. Tiếp theo tôi đã đi sâu hơn một chút vào bên trong và thấy rằng, chúng ta nên sử dụng phương thức <i> <b> changeColumn </ b> </ i> trong khi chúng ta thay đổi cả tên cột hoặc tên & định nghĩa. Và chúng ta nên sử dụng <i> <b> redirectColumn </ b> </ i> để thay đổi định nghĩa của cột. Thêm chi tiết tại <i> Magento \ Framework \ DB \ Adapter \ AdapterInterface </ i> Ví dụ tại <i> Magento \ SalesRule \ Setup \ Nâng cấpSchema </ i> Cảm ơn
Sandipan S

Câu trả lời:


28

tạo app\code\Sugarcode\Test\Setup\UpgradeSchema.phpvà chạy lệnh nâng cấp

khi bao giờ phiên bản đã được thay đổi, chỉ cần thay đổi trong module.xml và trong Nâng cấpSchema.php, thêm một phiên bản nữa nếu điều kiện so sánh với phiên bản

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

            // Changes here.
        }

Vì vậy, khi bạn chạy lệnh nâng cấp, nó sẽ chạy UpgradeSchema.phptệp và trong đó nó sẽ so sánh phiên bản dựa trên phiên bản đó, nó sẽ thực thi mã

Ví dụ

<?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();

    }
}

mô-đun

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

nếu nó hoạt động chấp nhận câu trả lời bằng cách nhấp vào biểu tượng bên phải


1
@ pradeep-kumar Nhận xét cột là nơi addColumn và changeColumn mong đợi tên lược đồ. public function addColumn($tableName, $columnName, $definition, $schemaName = null);. Bạn có thể đặt nhận xét 'Đã cập nhật tại' trong mảng định nghĩa $ như thế nào ['comment' => 'Updated At'].
Anton Evers

@Pradeep, Phiên bản của tôi là "1.0.0", vậy nếu (version_compare ($ bối cảnh-> getVersion (), '1.0.0', '<')) {} bây giờ nó có hoạt động hay không?
jafar pinjar

Phiên bản cũ hơn là gì, nếu phiên bản cũ ít hơn 1.0.0 thì nó hoạt động
Pradeep Kumar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.