Magento2 InstallSchema добавить новый столбец в существующую таблицу


11

Я пытаюсь добавить новый столбец в существующую таблицу в magento2

<?php

namespace Vendor\Module\Setup;

use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;

/**
 * @codeCoverageIgnore
 */
class InstallSchema implements InstallSchemaInterface
{

    /**
     * {@inheritdoc}
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     */
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $installer = $setup;

        $installer->startSetup();

        $eavTable = $installer->getTable('eav_attribute');

        $columns = [
            'my_column' => [
                'type' => \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
                'length' => '1',
                'nullable' => false,
                'comment' => 'Description of my column',
            ],
        ];

        $connection = $installer->getConnection();
        foreach ($columns as $name => $definition) {
            $connection->addColumn($eavTable, $name, $definition);
        }

        $installer->endSetup();
    }
}

Настройка php bin / magento: обновление

Ничего не произошло

Upd 1.

Если я четко понимаю цель, InstallSchema выполняется только тогда, когда в таблице настроек нет никаких значений. Если ваш модуль уже установлен в системе - вам нужно внести какие-либо изменения в UpgradeSchema. Это потому, что мой файл не запустился. Когда я переименовал его, чтобы обновить и внести необходимые изменения - все стало работать правильно

Ответы:


7

Во-первых, я предполагаю, что когда вы говорите, что ничего не происходит, вы имеете в виду, что скрипт установки работает как обычно, но никаких ошибок не выводится и в вашу базу данных не было внесено никаких изменений. Если это неверное предположение, пожалуйста, дайте мне знать!

Когда я делаю обновление до схемы, я не делаю getTable(), я думаю, что это излишне.

Я протестировал приведенный выше скрипт с этим изменением, и он сработал, поэтому я предпринял два шага по устранению неполадок:

  1. Убедитесь, что вы увеличили значение setup_versionв вашем module.xml(или ваш скрипт не будет работать вообще)
  2. Добавьте очевидную ошибку в ваш скрипт обновления, чтобы увидеть, работает ли он вообще ... если есть ошибка и скрипт запущен, вы получите сообщения об ошибках при запуске setup:upgrade

Надеюсь, это поможет!


1
Благодарю за ваш ответ. Если я четко понимаю цель, InstallSchema выполняется только тогда, когда в таблице настроек нет никаких значений. Если ваш модуль уже установлен в системе - вам нужно внести какие-либо изменения в UpgradeSchema. Это потому, что мой файл не запустился. Когда я переименовал его, чтобы обновить и внести необходимые изменения - все стало работать правильно
Жартауник

Извините, это на 100% правильно, шаг 1 должен был удалить запись из таблицы setup_module или сделать ее сценарием обновления. Я рад, что это работает для вас!
Jer_


0

Вы можете создать скрипт и в вашей папке dbscripts и запустить этот файл из терминала или веб-браузера.

например, сохраните файл, pub/dbscripts/filename.phpвставьте этот код и измените в соответствии с вашими требованиями

<?php
use Magento\Framework\App\Bootstrap;
require '../../app/bootstrap.php';
$bootstrap = Bootstrap::create(BP, $_SERVER);
$obj = $bootstrap->getObjectManager();
$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
error_reporting(E_ALL);
ini_set('display_errors', 1);
$resource = $objectManager->get('Magento\Framework\App\ResourceConnection');
$connection = $resource->getConnection();

$salesTable = $resource->getTableName('Table_Name');
$sql = "ALTER TABLE ".$salesTable. " ADD `Field_name` varchar(255)";
$connection->query($sql);

echo"Script Run Successfully";

запустить этот файл из браузера как

domain.name/pub/dbscripts/filename.php
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.