Magento2 InstallSchema dodaje nową kolumnę do istniejącej tabeli


11

Próbuję dodać nową kolumnę do istniejącej tabeli w 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();
    }
}

konfiguracja php bin / magento: aktualizacja

Nic się nie dzieje

Aktualizacja 1.

Jeśli jasno rozumiem cel, program InstallSchema wykonuje się tylko wtedy, gdy w tabeli konfiguracji nie ma żadnych wartości. Jeśli twój moduł jest już zainstalowany w systemie - musisz wprowadzić zmiany w UpgradeSchema. To dlatego, że mój plik się nie uruchomił. Kiedy zmieniłem nazwę, aby zaktualizować i wprowadzić niezbędne zmiany - wszystko zaczęło działać poprawnie

Odpowiedzi:


7

Po pierwsze, zakładam, że kiedy mówisz, że nic się nie dzieje, masz na myśli, że skrypt instalacyjny działa jak zwykle, ale nie są generowane żadne błędy i nie wprowadzono żadnych zmian w bazie danych. Jeśli to nie jest prawidłowe założenie, daj mi znać!

Kiedy robię aktualizację schematu, nie robię getTable(), myślę, że to jest zbyteczne.

Testowałem powyższy skrypt z tą zmianą i zadziałał, więc dwa kroki rozwiązywania problemów, które podejmę, to:

  1. Upewnij się, że zwiększyłeś wartość setup_versionw swoim module.xml(w przeciwnym razie skrypt nie będzie w ogóle działał)
  2. Dodaj oczywisty błąd do skryptu aktualizacji, aby zobaczyć, czy w ogóle działa ... jeśli wystąpi błąd i skrypt jest uruchomiony, otrzymasz komunikaty o błędach podczas uruchamiania setup:upgrade

Mam nadzieję że to pomogło!


1
Dziękuję za odpowiedź. Jeśli jasno rozumiem cel, program InstallSchema wykonuje się tylko wtedy, gdy w tabeli konfiguracji nie ma żadnych wartości. Jeśli twój moduł jest już zainstalowany w systemie - musisz wprowadzić zmiany w UpgradeSchema. To dlatego, że mój plik się nie uruchomił. Kiedy
zmieniłem

Przykro mi, to jest poprawne w 100%, krok 1 powinien był usunąć wpis z tabeli setup_module lub uczynić go skryptem aktualizacji. Cieszę się, że to dla ciebie działa!
Jer_

0

Usuń wpis modułu z tabeli 'setup_module', a następnie uruchom polecenie php bin / magento setup: upgrade. To będzie działać.


0

możesz stworzyć skrypt i folder dbscripts i uruchomić ten plik z terminala lub przeglądarki internetowej.

np. zapisz plik pub/dbscripts/filename.phpwklej ten kod i zmień zgodnie z wymaganiami

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

uruchom ten plik z przeglądarki jak

domain.name/pub/dbscripts/filename.php
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.