【EC-CUBE 4】既存テーブルに新しい項目(プロパティ)を追加する方法

この記事では、以下のようなデータベース(テーブル)を拡張する方法を、実例を交えつつ解説しています。

  • 商品に、『メーカー』『産地』『サイズ』・・・ などの新しいスペックを追加したい。
  • 注文情報に、『名入れ』『包装』『のし掛け』・・・ などのオプションを追加したい。
  • 会員情報に、『部署名』『年齢』・・・ などの新しい情報を追加したい。

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

SSH接続方法(Xserver)

もしレンタルサーバーのXserverを使っていれば、以下記事でSSH接続方法を解説しています。

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

目次

商品テーブル(dtb_product)に『産地』を追加してみる

実際にデータベースを拡張する例として、商品テーブル(dtb_product)に産地(”production_area” というプロパティ)を追加してみます。

拡張後データベース
『dtb_product』の最終行(13行目)に「production_area」を追加

これを追加しておけば、デフォルトで用意されている商品名や商品コードなどに加えて産地も管理できるようになります。

商品テーブルの拡張手順

  1. 既存のEntityクラスを拡張するためのTraitファイル(ProductTrait.php)を作成し、サーバーにアップ。
  2. サーバーにSSH接続し、PHPのバージョンを7.4に設定。(すでに7.4の場合は不要)
  3. コマンドでProxyを作成。
  4. コマンドでキャッシュをクリアしてから、SQLを実行。

②・③・④は、サーバーにSSH接続してコマンドラインで行う操作です。
ちょっと難しいですが、順々に説明します。

STEP

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;
    }
}
ProductTraitの格納先
作成したTraitファイルは「app/Customize/Entity」下にアップ
Traitファイルの基本構成
  • 拡張したいエンティティを指定する
  • 新しいプロパティの宣言
  • データを保存するための「setメソッド」を作成
  • データを取り出すための「getメソッド」を作成
STEP

コマンドラインの操作

Traitファイルがアップできたら、次はサーバーにSSH接続して以下コマンドを入力していきます。

PHP 7.4が使えるようにする(対応済の場合はスキップ)

php -v

まずPHPのバージョンを確認しておきます。
もし上記コマンドを入力して、PHPのバージョンが7.2以下となるようであれば、PHP7.4が使えるように変更します。

Xserverを使っている場合、2022年3月時点でのPHPのバージョンは5.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ファイルが作成されます。

proxy作成結果

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

ProductEntityの中身

作成された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です。

拡張後データベース
コマンド実行後の『dtb_product』の構造

まとめ & 次のステップ

以上、データベース(エンティティ)の拡張方法について紹介しました。

Traitの作成はともかく、SSH接続やコマンドラインが初めての方はかなり戸惑うと思います。
いきなりで不安な方は、練習用のサイトを用意して試してから行うことをオススメします。
また余裕のある方は、ドットインストールなどの学習サービスでコマンドラインを少し学んでから行うとスムーズかと思います。

ぜひ、自分なりのやり方でトライしてみてください。

また以下記事では、管理画面の商品登録から、今回追加したプロパティに値を保存する方法を解説しています。合わせてご覧ください。

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