- 商品に、『メーカー』『産地』『サイズ』・・・ などの新しいスペックを追加したい。
- 注文情報に、『名入れ』『包装』『のし掛け』・・・ などのオプションを追加したい。
- 会員情報に、『部署名』『年齢』・・・ などの新しい情報を追加したい。
この記事では、EC-CUBE 4でデータベースを拡張する方法を、実例を交えつつ解説しています。
なおデータベース拡張には、サーバーにSSH接続してコマンド入力する必要があります。
慣れていないとSSH接続までが大変かと思いますが、データベースをカスタマイズできるとやれることがグンと増えるので、ぜひトライしてほしいと思います。
商品データベースに『産地』を追加してみる
実際にデータベースを拡張する例として、商品データベース(dtb_product)に産地(”production_area” という名前の項目)を追加してみます。

これを追加しておくことで、デフォルトで用意されている商品名や商品コードなどに加えて産地も管理できるようになります。
商品データベースの拡張手順
- 既存のEntityクラスを拡張するためのTraitファイル(ProductTrait.php)を作成し、サーバーにアップ。
- サーバーにSSH接続し、PHPのバージョンを7.4に設定。(すでに7.4の場合は不要)
- コマンドでProxyを作成。
- コマンドでキャッシュをクリアしてから、SQLを実行。
このうち①は、Controllerなどのファイルをサーバーにアップするとき と同じように操作を行います。
②・③・④は、サーバーにSSH接続してコマンドラインで行う操作です。
ちょっと難しいですが、順々に説明します。
Traitファイルの作成
既存のデータベースを拡張するには、まず拡張対象のデータベースと対応するEntity(エンティティ)ファイルを拡張する必要があります。
今回は商品データベース(dtb_product)を拡張するので、それに対応するエンティティ(Product.php)を拡張します。
なお拡張するといっても、直接そのファイルに追記するわけではなく、Traitというファイルを新たに作成することで対応できます。
- 各データベースがどのエンティティに対応するかは、「src/Eccube/Entity」下にあるファイルを参照してください。
- src下のファイルをいじると、何かあったときに修復が難しくなるので、基本的にいじらないでください。
ということで、以下コードを記述したファイル(ProductTrait.php)を作成し、「app/Customize/Entity」下にアップします。
<?php
namespace Customize\Entity;
use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation\EntityExtension;
/**
* @EntityExtension("Eccube\Entity\Product")
*/
trait ProductTrait
{
/**
* @var string|null
*
* @ORM\Column(name="production_area", type="string", length=255, nullable=true)
*/
private $production_area = null;
/**
* Set production_area.
*
* @param string $production_area|null
*
* @return Product
*/
public function setProductionArea($production_area = null)
{
$this->production_area = $production_area;
return $this;
}
/**
* Get production_area.
*
* @return string
*/
public function getProductionArea()
{
return $this->production_area;
}
}
- オレンジ下線部
-
拡張したいエンティティのディレクトリを指定。
- 青下線部
-
データの格納形式(カラム名やデータ型、文字数、nullを許可するか、など)を指定。
ここでは、カラム名「production_area」、string(文字列)型、255文字まで、null(空欄)OK、となっています。 - 緑下線部
-
新しい項目を設定するときの決まり文句。
set関数とget関数を定義しておくことで、データの読み書きができるようになる。

コマンドラインの操作
Traitファイルがアップできたら、次はサーバーにSSH接続して以下コマンドを入力していきます。
PHP 7.4が使えるようにする(対応済の場合はスキップ)
php -v
まずPHPのバージョンを確認しておきます。
もし上記コマンドを入力して、PHPのバージョンが7.2以下となるようであれば、PHP7.4が使えるように変更します。
変更の仕方は環境によって異なると思いますが、Xserverの場合は こちらの記事 を参考にしてみてください。
記事内では7.2になっているので、7.4に書き換えるのをお忘れなく。
Proxyを作成する
以下コマンドを入力し、「app/proxy」下にProduct.phpを作成します。
なお、以下はEC CUBEの各フォルダ(appやbin、srcなど)が格納されている一つ上の階層にいる状態からの入力ですので、事前にそのディレクトリまで移動してから始めてください。
Xserverの場合、「public_html」にいる状態になると思います。
cd bin
chmod 0704 console
binフォルダ内のconsoleに対し、実行権限を付与。(すでに実行権限がある場合、この操作は不要)
cd ..
bin/console eccube:generate:proxies
元のディレクトリに戻って、proxyを作成するためのコマンドを入力。
成功すれば、「gen -> /home/・・・・・・・・・・/app/proxy/entity/src/Eccube/Entity/Product.php」という文言が表示され、実際にそのディレクトリにProduct.phpファイルが作成されます。

上記コマンドを実行すると、「app/proxy/entity/src/Eccube/Entity」下にProduct.phpが作成されます。

作成されたProduct.phpの中身には、事前に準備したProductTraitを参照するコードが記載されており、エンティティが拡張されています。
SQLを実行し、データベースに反映する
Proxyを作成できたら、引き続きコマンドを使ってデータベースに反映させます。
bin/console cache:clear --no-warmup
作成した Proxy を認識できるよう、キャッシュを削除。
実行すると、
[OK] Cache for the ・・・・・・・ was successfully cleared.
というような文言が表示される。
bin/console doctrine:schema:update --dump-sql
実行されるSQLを確認するためのコマンド。
このコマンドではSQLは実行されず、あくまで確認用です。
bin/console doctrine:schema:update --dump-sql --force
先程のコマンドに「–force」を付けることで、実際にSQLが実行されます。
このコマンド実行後、問題がなければデータベースが拡張されています。

実際にデータベースを開き、『dtb_product』の最終行(13行目)に「production_area」が追加されていればOKです。

まとめ
以上、データベース(エンティティ)の拡張方法について紹介しました。
Traitの作成はともかく、SSH接続やコマンドラインが初めての方はかなり戸惑うと思います。
いきなりで不安な方は、練習用のサイトを用意して試してから行うことをオススメします。
また余裕のある方は、ドットインストールなどの学習サービスでコマンドラインを少し学んでから行うとスムーズかと思います。
ぜひ、自分なりのやり方でトライしてみてください。