この記事では、以下のようなデータベース(テーブル)を拡張する方法を、実例を交えつつ解説しています。
- 商品に、『メーカー』『産地』『サイズ』・・・ などの新しいスペックを追加したい。
- 注文情報に、『名入れ』『包装』『のし掛け』・・・ などのオプションを追加したい。
- 会員情報に、『部署名』『年齢』・・・ などの新しい情報を追加したい。
データベース拡張には、サーバーにSSH接続してコマンド入力する必要があります。
慣れていないとSSH接続までが大変かと思いますが、データベースをカスタマイズできるとやれることがグンと増えるので、ぜひトライしてほしいと思います。
SSH接続方法(Xserver)
もしレンタルサーバーのXserverを使っていれば、以下記事でSSH接続方法を解説しています。
商品テーブル(dtb_product)に『産地』を追加してみる
実際にデータベースを拡張する例として、商品テーブル(dtb_product)に産地(”production_area” というプロパティ)を追加してみます。
これを追加しておけば、デフォルトで用意されている商品名や商品コードなどに加えて産地も管理できるようになります。
商品テーブルの拡張手順
- 既存のEntityクラスを拡張するためのTraitファイル(ProductTrait.php)を作成し、サーバーにアップ。
- サーバーにSSH接続し、PHPのバージョンを7.4に設定。(すでに7.4の場合は不要)
- コマンドでProxyを作成。
- コマンドでキャッシュをクリアしてから、SQLを実行。
②・③・④は、サーバーにSSH接続してコマンドラインで行う操作です。
ちょっと難しいですが、順々に説明します。
Traitファイル(ProductTrait.php)の作成
既存テーブルの拡張は、まず対象テーブルに対応するEntity(エンティティ)を拡張するための「Traitファイル」を作成します。
今回は商品テーブル(dtb_product)を拡張するので、それに対応するエンティティ(Product.php)を指定したTraitファイルを作成します。
- 各テーブルがどのエンティティに対応するかは、「src/Eccube/Entity」下にあるファイルを参照してください。
- src下のファイルをいじると、何かあったときに修復が難しくなるので、基本的にいじらないでください。
ということで、以下コードを記述したTraitファイル(ProductTrait.php)を作成し、「app/Customize/Entity」下にアップします。
<?php
namespace Customize\Entity;
use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation\EntityExtension;
/**
* 拡張したいエンティティ(ここでは「Product」エンティティ)を指定。
*
* @EntityExtension("Eccube\Entity\Product")
*/
trait ProductTrait
{
/**
* 製品の生産地域として、$production_areaを用意。
* プロパティ名(name)、データ型(type)、文字数(length)、nullを許可するか(nullable)、なども合わせて指定。
*
* @var string|null
*
* @ORM\Column(name="production_area", type="string", length=255, nullable=true)
*/
private $production_area = null;
/**
* setメソッドで製品の生産地域($production_area)を保存できるようにする。
* 値が設定されなかった場合、nullに設定される。
*
* @param string $production_area|null
*
* @return Product
*/
public function setProductionArea($production_area = null)
{
$this->production_area = $production_area;
return $this;
}
/**
* getメソッドで製品の生産地域($production_area)を取り出せるようにする。
* 値が設定されていない場合、nullを返す。
*
* @return string|null
*/
public function getProductionArea()
{
return $this->production_area;
}
}
- 拡張したいエンティティを指定する
- 新しいプロパティの宣言
- データを保存するための「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接続やコマンドラインが初めての方はかなり戸惑うと思います。
いきなりで不安な方は、練習用のサイトを用意して試してから行うことをオススメします。
また余裕のある方は、ドットインストールなどの学習サービスでコマンドラインを少し学んでから行うとスムーズかと思います。
ぜひ、自分なりのやり方でトライしてみてください。
また以下記事では、管理画面の商品登録から、今回追加したプロパティに値を保存する方法を解説しています。合わせてご覧ください。