Magento2 InstallSchema ajoute une nouvelle colonne à la table existante

11

J'essaie d'ajouter une nouvelle colonne à la table existante dans 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();
    }
}

configuration de php bin / magento: mise à niveau

Il ne se passe rien

Upd 1.

Si je comprends clairement l'objectif, InstallSchema s'exécute uniquement lorsqu'il n'y a aucune valeur dans la table de configuration. Si votre module est déjà installé dans le système - vous devez apporter des modifications dans UpgradeSchema. Cela parce que mon fichier ne s'est pas exécuté. Quand je l'ai renommé pour mettre à niveau et apporter les modifications nécessaires - tout a commencé à fonctionner correctement

zhartaunik
la source

Réponses:

7

Tout d'abord, je suppose que lorsque vous dites que rien ne se passe, vous voulez dire que le script d'installation s'exécute comme d'habitude, mais aucune erreur n'est générée et aucune modification n'a été apportée à votre base de données. Si ce n'est pas une hypothèse correcte, faites-le moi savoir!

Quand je fais une mise à niveau du schéma, je ne fais pas de getTable(), je pense que c'est superflu.

J'ai testé le script ci-dessus avec ce changement, et cela a fonctionné, donc les deux étapes de dépannage que je prendrais sont les suivantes:

  1. Assurez-vous que vous avez incrémenté le setup_versiondans votre module.xml(ou votre script ne s'exécutera pas du tout)
  2. Ajoutez une erreur évidente dans votre script de mise à niveau pour voir s'il est en cours d'exécution ... s'il y a une erreur et que le script est en cours d'exécution, vous obtiendrez des messages d'erreur lors de l'exécution setup:upgrade

J'espère que ça aide!

Jer_
la source
1
Merci pour votre réponse. Si je comprends clairement l'objectif, InstallSchema s'exécute uniquement lorsqu'il n'y a aucune valeur dans la table de configuration. Si votre module est déjà installé dans le système - vous devez apporter des modifications dans UpgradeSchema. Cela parce que mon fichier ne s'est pas exécuté. Quand je l'ai renommé pour mettre à niveau et apporter les modifications nécessaires - tout a commencé à fonctionner correctement
zhartaunik
Je suis désolé, c'est 100% correct, l'étape 1 aurait dû être de supprimer l'entrée de la table setup_module ou d'en faire un script de mise à niveau. Je suis content que ça marche pour vous!
Jer_
0

Supprimez l'entrée du module de la table 'setup_module' puis exécutez la commande php bin / magento setup: upgrade. Ça va marcher.

tester
la source
0

vous pouvez créer un script et dans votre dossier dbscripts et exécuter ce fichier à partir du terminal ou du navigateur Web.

par exemple enregistrer le fichier dans pub/dbscripts/filename.phpcoller ce code et modifier selon vos besoins

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

exécutez ce fichier à partir du navigateur comme

domain.name/pub/dbscripts/filename.php
Asad Ullah
la source