テーブルを作成したけど、あとでテーブル名やカラム名、データ型を変更したい場合はどうすれば?
この記事では、EC-CUBE 4で作成したテーブル内容の修正方法を、実例を交えつつ解説しています。
データベースの操作には、サーバーにSSH接続してコマンド入力する必要があります。
慣れていないとSSH接続までが大変かと思いますが、データベースをカスタマイズできるとやれることがグンと増えるので、ぜひトライしてほしいと思います。
本記事では、以下記事で拡張または新規作成したテーブルの修正を例として紹介していますので、まずこれらの記事から読み進めると理解しやすいかと思います。
修正内容
1.新規作成したテーブルと、2.カラムを追加した既存テーブル(EC-CUBE 4にデフォルトで用意されているテーブル)の2つについて、内容を修正します。
なお、この方法で既存テーブルに用意されている既存のカラム(『dtb_product』における「name」など)も変更できますが、既存テーブルを参照するページでバグが起きやすくなるので推奨しません。
新規で作成したテーブルの「テーブル名」と「カラム」を修正する
『dtb_Maker』というテーブルを新規で作成した状態。
- テーブル名:『dtb_Maker』→『dtb_maker』
- 「code」のデータ型:「varchar(4000)」→「varchar(8)」
既存テーブルに「新規で追加したカラム」を修正する
商品テーブル(dtb_product)に『生産地』を意味する「production_area」という項目を追加した状態。
- 名前:「production_area」→「maker_id」
- データ型:「varchar(255)」→「int(11)」
修正手順
新規で作成したテーブルの「テーブル名」と「カラム」の修正手順
- Entityファイル(Maker.php)を修正し、サーバーにアップ。
- サーバーにSSH接続し、コマンドでキャッシュをクリアしてからSQLを実行。(カラムの情報が修正される。)
- データベースでSQLを直接入力し、テーブル名を変更。
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タグから以下の通りクエリを実行します。
問題がなければ、これでテーブル名が変更されているはずです。
既存テーブルに「新規で追加したカラム」の修正手順
- Traitファイル(ProductTrait.php)を修正し、サーバーにアップ。
- コマンドでキャッシュをクリアしてから、SQLを実行。(カラムの情報が修正される。)
- 【EC-CUBE管理画面から、データを登録できるようにしている場合】商品登録フォームとTwigファイルを修正。
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です。
ただテーブルを変更すると、変更前の内容を参照しているページでエラーが発生し、修正箇所も膨大になります。なるべく変更しない方が良いので、どうしても変更が必要な場合のみ対応するようにしましょう。