【EC-CUBE 4】作成済テーブルを修正する方法

EC-CUBE4 データベーステーブルの修正方法

テーブルを作成したけど、あとでテーブル名やカラム名、データ型を変更したい場合はどうすれば?

この記事では、EC-CUBE 4で作成したテーブル内容の修正方法を、実例を交えつつ解説しています。

データベースの操作には、サーバーにSSH接続してコマンド入力する必要があります。
慣れていないとSSH接続までが大変かと思いますが、データベースをカスタマイズできるとやれることがグンと増えるので、ぜひトライしてほしいと思います。

本記事では、以下記事で拡張または新規作成したテーブルの修正を例として紹介していますので、まずこれらの記事から読み進めると理解しやすいかと思います。

【動作環境】
EC CUBEのバージョン:4.1.2
サーバー:Xserver

目次

修正内容

1.新規作成したテーブルと、2.カラムを追加した既存テーブル(EC-CUBE 4にデフォルトで用意されているテーブル)の2つについて、内容を修正します。

なお、この方法で既存テーブルに用意されている既存のカラム(『dtb_product』における「name」など)も変更できますが、既存テーブルを参照するページでバグが起きやすくなるので推奨しません。

新規で作成したテーブルの「テーブル名」と「カラム」を修正する

修正前
テーブル名編集前
テーブル名(修正前)
データ型変更前
「code」のデータ型(修正前)

『dtb_Maker』というテーブルを新規で作成した状態。

修正後
テーブル名編集後
テーブル名(修正後)
データ型変更後
「code」のデータ型(修正後)
  • テーブル名:『dtb_Maker』→『dtb_maker』
  • 「code」のデータ型:「varchar(4000)」→「varchar(8)」

既存テーブルに「新規で追加したカラム」を修正する

修正前
拡張後データベース

商品テーブル(dtb_product)に『生産地』を意味する「production_area」という項目を追加した状態。

修正後
dtb_productのカラム名変更後
  • 名前:「production_area」→「maker_id」
  • データ型:「varchar(255)」→「int(11)」

修正手順

新規で作成したテーブルの「テーブル名」と「カラム」の修正手順

  1. Entityファイル(Maker.php)を修正し、サーバーにアップ。
  2. サーバーにSSH接続し、コマンドでキャッシュをクリアしてからSQLを実行。(カラムの情報が修正される。)
  3. データベースでSQLを直接入力し、テーブル名を変更。

こちらの記事で新規作成した『dtb_Maker』テーブルについて、そのテーブル名と「code」カラムのデータ長を修正する手順です。

Entityファイル(Maker.php)の修正

すでにアップされているEntityファイルを以下の通り修正します。
変更点はでハイライト(2ヶ所)しています。

<?php

namespace Customize\Entity;

use Eccube\Entity\AbstractEntity;
use Doctrine\ORM\Mapping as ORM;

/**
 * Maker
 *
 * @ORM\Table(name="dtb_maker")
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="discriminator_type", type="string", length=255)
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Entity(repositoryClass="Eccube\Repository\MakerRepository")
 */
class Maker extends AbstractEntity
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", options={"unsigned":true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @var string|null
     *
     * @ORM\Column(name="code", type="string", length=8, nullable=true)
     */
    private $code;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="create_date", type="datetimetz")
     */
    private $create_date;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="update_date", type="datetimetz")
     */
    private $update_date;

    /**
     * Get id.
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name.
     *
     * @param string $name
     *
     * @return Maker
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name.
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set code.
     *
     * @param string|null $code
     *
     * @return Maker
     */
    public function setCode($code = null)
    {
        $this->code = $code;

        return $this;
    }

    /**
     * Get code.
     *
     * @return string|null
     */
    public function getCode()
    {
        return $this->code;
    }

    /**
     * Set createDate.
     *
     * @param \DateTime $createDate
     *
     * @return Maker
     */
    public function setCreateDate($createDate)
    {
        $this->create_date = $createDate;

        return $this;
    }

    /**
     * Get createDate.
     *
     * @return \DateTime
     */
    public function getCreateDate()
    {
        return $this->create_date;
    }

    /**
     * Set updateDate.
     *
     * @param \DateTime $updateDate
     *
     * @return Maker
     */
    public function setUpdateDate($updateDate)
    {
        $this->update_date = $updateDate;

        return $this;
    }

    /**
     * Get updateDate.
     *
     * @return \DateTime
     */
    public function getUpdateDate()
    {
        return $this->update_date;
    }
}

SSH接続してコマンド操作

テーブルを新規作成したときと同様の操作を行います。

問題がなければ、これでカラム「code」のデータ型が修正されているはずです。

データベースでSQLを直接入力

実は、ここまでの操作だけではテーブル名を変更することはできませんでした。

ということで、データベースを直接SQLで操作してテーブル名を変更します。(Entityファイルでテーブル名に関係する部分は修正済のため、問題はないと思われます。)

データベースにアクセスし、以下のSQLを打ち込んでテーブル名を変更します。

RENAME TABLE dtb_Maker TO dtb_maker;

『RENAME TABLE A TO B』で、テーブルAの名前をBに変更できます。

なおXserverを使っている方は、phpMyAdminでSQLタグから以下の通りクエリを実行します。

テーブル名を変更するSQL

問題がなければ、これでテーブル名が変更されているはずです。

既存テーブルに「新規で追加したカラム」の修正手順

  1. Traitファイル(ProductTrait.php)を修正し、サーバーにアップ。
  2. コマンドでキャッシュをクリアしてから、SQLを実行。(カラムの情報が修正される。)
  3. 【EC-CUBE管理画面から、データを登録できるようにしている場合】商品登録フォームとTwigファイルを修正。

こちらの記事で拡張した『dtb_product』テーブルの「production_area」カラムについて、そのカラム名を「Maker_id」に、データ型を「数値型」に変更する手順です。

Traitファイル(ProductTrait.php)の修正

すでにアップされているTraitファイルを以下の通り修正します。
変更点はでハイライトしています。

<?php

namespace Customize\Entity;

use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation\EntityExtension;

/**
  * @EntityExtension("Eccube\Entity\Product")
 */
trait ProductTrait
{
    /**
     * @var integer|null
     * 
     * @ORM\Column(name="maker_id", type="integer", nullable=true)
     */
    private $maker_id = null;

    /**
     * Set maker_id.
     * 
     * @param integer $maker_id|null
     * 
     * @return Product
     */
 
    public function setMakerId($maker_id = null)
    {
      $this->maker_id = $maker_id;

      return $this;
    }

    /**
     * Get maker_id.
     * 
     * @return integer
     */
    public function getMakerId()
    {
      return $this->maker_id;
    }
}

SSH接続してコマンド操作

テーブルを拡張したときと同様の操作を行います。
ただProxyはすでに作成済のはずなので、その操作は省きます。

問題がなければ、これで「production_area」カラムが修正されているはずです。

(必要に応じて)商品登録フォームとTwigファイルを修正

こちらの記事 で「production_area」をEC-CUBE管理画面から登録できるように設定していた場合、「production_area」が「maker_id」に変わったことでエラーが発生しているはずなので、以下を参考に修正してください。

これに限らず、変更箇所を参照するページではエラーが発生している可能性があるため、適宜修正が必要です。

まとめ

以上、新規作成したテーブルや拡張済みテーブルの修正方法について解説しました。

基本的には修正したい箇所をその通り修正し、再度コマンドでSQLを実行すればOKです。
ただテーブルを変更すると、変更前の内容を参照しているページでエラーが発生し、修正箇所も膨大になります。なるべく変更しない方が良いので、どうしても変更が必要な場合のみ対応するようにしましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ノベルティグッズのECサイトを運営する中小企業役員。
本ブログを通じ、販促向けの最新/ロングセラー商品紹介やWebサイト制作に役立つ技術情報を発信しています。

目次