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 setup:upgrade

何も起こりません

アップデート1。

目標を明確に理解している場合、InstallSchemaは、セットアップテーブルに値がない場合にのみ実行されます。モジュールがすでにシステムにインストールされている場合-UpgradeSchemaで変更を行う必要があります。それは私のファイルが実行されなかったためです。アップグレードして必要な変更を加えるために名前を変更したとき-すべてが正しく機能し始めました

回答:


7

まず、何も起こらないと言うとき、セットアップスクリプトは通常どおり実行されますが、エラーは出力されず、データベースに変更は加えられなかったと想定しています。これが正しい仮定でない場合は、お知らせください!

スキーマをアップグレードするときは、を実行しませんgetTable()。それは不必要だと思います。

この変更を加えた上記のスクリプトをテストし、それが機能したので、次の2つのトラブルシューティング手順を実行します。

  1. をインクリメントしていることを確認してsetup_versionくださいmodule.xml(またはスクリプトがまったく実行されません)
  2. アップグレードスクリプトに明らかなエラーを追加して、スクリプトが実行されているかどうかを確認します...エラーがあり、スクリプトが実行されている場合、実行時にエラーメッセージが表示されます setup:upgrade

それがお役に立てば幸いです!


1
お返事ありがとうございます。目標を明確に理解している場合、InstallSchemaは、セットアップテーブルに値がない場合にのみ実行されます。モジュールがすでにシステムにインストールされている場合-UpgradeSchemaで変更を行う必要があります。それは私のファイルが実行されなかったためです。アップグレードして必要な変更を加えるために名前を変更したとき-すべてが適切に機能し始めました
zhartaunik '18 / 06/18

すみません、100%正解です。ステップ1は、setup_moduleテーブルからエントリを削除するか、それをアップグレードスクリプトにすることでした。ご利用いただきありがとうございます。
Jer_

0

テーブル「setup_module」からモジュールのエントリを削除し、php bin / magento setup:upgradeコマンドを実行します。それが動作します。


0

スクリプトを作成し、dbscriptsフォルダーにこのファイルをターミナルまたはWebブラウザーから実行できます。

たとえば、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.