EC-CUBE3でテーブルにカラムを追加

シェアする

EC-CUBE3でテーブルにカラムを追加(編集)する場合、公式の方法として下記のように行います。

エンティティ、リポジトリ | EC-CUBE 開発ドキュメント

既存テーブルに対する拡張
基本的に既存テーブルに対してプラグインからカラムを追加するような拡張は推奨していません。

既存テーブルに対して、例えばdtb_customerテーブルにニックネームを追加したい時は、プラグイン側でplg_profileというようなテーブルを作成して関連付けをします。

プラグインを使って既存のテーブルに拡張をする場合、カラム追加する上でテーブルも増えてしまいます。
そうすると、拡張するテーブルが増えると処理の実装で見なければいけないテーブルの数も増え、複雑になってしまいます。
その複雑化を避け、実装を行いやすくするために、今回プラグインを使わず直接テーブルにカラムを追加していく方法を紹介します。

作業環境は下記の通りです。

  • EC-CUBE(3.0.16)
スポンサーリンク

dcm.ymlの編集

DB定義のベースとなっているsrc/Eccube/Resource/doctrine/ymlを編集します。
例としてEccube.Entity.Product.dcm.ymlの任意の位置に下記を追加します。
「Eccube.Entity.Product.dcm.yml」

fields:
comment:
type: text
nullable: true
length: 65535

Entityの更新

編集したymlファイルをベースに下記コマンドでEntityファイルを更新します。

$ cd EC-CUBE3インストールディレクトリ
$ vendor/bin/doctrine orm:generate:entities --extend="Eccube\Entity\AbstractEntity" src

再生成ではなく更新なので独自に追加したものもそのまま保持されます。

今回追加された内容は下記のようになります。
「src/Eccube/Entity/Product.php」

/**
* @var string
*/
private $comment;

/**
* Set comment
*
* @param string $comment
* @return Product
*/
public function setComment($comment)
{
    $this->comment = $comment;

    return $this;
}

/**
* Get comment
*
* @return string
*/
public function getComment()
{
    return $this->comment;
}

マイグレーションファイル生成

下記コマンドでsrc/Eccube/Resource/doctrine/migration内にマイグレーションファイルを自動生成します。

$ php app/console migrations:diff

下記DROP INDEXとCREATE INDEXの処理は不要な変更なので削除しておきます。

<?php
namespace DoctrineMigrations;

use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;

/** * Auto-generated Migration: Please modify to your needs! */
class Version20180926131844 extends AbstractMigration
{
    /** * @param Schema $schema */
    public function up(Schema $schema)
    {
        // this up() migration is auto-generated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() != 'mysql','Migration can only be executed safely on \'mysql\'.');

        $this->addSql('DROP INDEX dtb_customer_email_idx ON dtb_customer');
        $this->addSql('DROP INDEX dtb_order_pre_order_id_idx ON dtb_order');
        $this->addSql('DROP INDEX dtb_order_order_email_idx ON dtb_order');
        $this->addSql('DROP INDEX dtb_page_layout_url_idx ON dtb_page_layout');
        $this->addSql('ALTER TABLE dtb_product ADD comment TEXT DEFAULT NULL');
    }

    /**
     * @param Schema $schema
     */
    public function down(Schema $schema)
    {
        // this down() migration is auto-generated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() != 'mysql', 'Migration can only be executed safely on \'mysql\'.');

        $this->addSql('CREATE INDEX dtb_customer_email_idx ON dtb_customer (email)');
        $this->addSql('CREATE INDEX dtb_order_pre_order_id_idx ON dtb_order (pre_order_id)');
        $this->addSql('CREATE INDEX dtb_order_order_email_idx ON dtb_order (order_email)');
        $this->addSql('CREATE INDEX dtb_page_layout_url_idx ON dtb_page_layout (url)');
        $this->addSql('ALTER TABLE dtb_product ADD comment TEXT DEFAULT NULL');
    }

INDEXが差分として出てきてしまうのは、longtext型にINDEXを張る場合、対象とする文字列長を指定する必要があります。
マイグレーションファイルを自動生成する際には文字列長の指定まではしません。
そのため個別にマイグレーションが記述されており、dcm.ymlではコメントアウトされてるためそれが差分として抽出されるからです。

マイグレーション実行

  • 実行コマンド
$ php app/console migrations:migrate
  • ロールバック実行
    ファイル名がVersion2018xxxxxxxxxx.phpの場合
$ php app/console migrations:execute --down 2018xxxxxxxxxx
  • ブラウザで実行
    コマンドでマイグレーション実行できない場合は下記URLにアクセスし、進めていきます。
    https://ドメイン名/install.php/migration
    なお、ブラウザからはロールバックは実行できないようです。

まとめ

dcm.ymlを編集し、コマンドで追加された分のエンティティが更新されます。
あとはマイグレーションファイルを生成し、余計な差分を消した後に実行します。

新卒1年目のエンジニアです。
主にPHPを勉強中で、今まで学んできたことを記事にしていきたいと思っております。

スポンサーリンク

シェアする

フォローする