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: оновлення

Нічого не відбувається

Оновлення 1.

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

Відповіді:


7

По-перше, я припускаю, що ви говорите, що нічого не відбувається, ви маєте на увазі, що сценарій установки працює як завжди, але помилок не виводиться і в базі даних не було внесено змін. Якщо це неправильне припущення, повідомте мене про це!

Коли я роблю оновлення схеми, я не роблю це getTable(), я вважаю, що це зайве.

Я протестував вищезгаданий сценарій із цією зміною, і він спрацював, тому два кроки усунення несправностей, які я б вчинив, це:

  1. Переконайтеся, що ви зробили додаток setup_versionу своєму module.xml(або ваш сценарій взагалі не працюватиме)
  2. Додайте явну помилку у свій сценарій оновлення, щоб побачити, чи працює він взагалі ... якщо помилка і сценарій запущений, під час запуску ви отримаєте повідомлення про помилки setup:upgrade

Я сподіваюся, що це допомагає!


1
Спасибі за вашу відповідь. Якщо я чітко розумію ціль, InstallSchema виконується лише тоді, коли в таблиці налаштувань немає ніяких значень. Якщо ваш модуль вже встановлений в системі - вам потрібно внести будь-які зміни в UpgradeSchema. Це тому, що мій файл не виконувався. Коли я перейменував його на оновлення та вніс необхідні зміни - все почало працювати належним чином
zhartaunik

Вибачте, що на 100% вірно, крок 1 повинен був видалити запис із таблиці setup_module або зробити його скриптом оновлення. Я радий, що це працює для тебе!
Джер_

0

Видаліть запис модуля з таблиці 'setup_module', після чого запустіть команду php bin / magento setup: upgrade. Це спрацює.


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.