【EC-CUBE 4】既存テーブルに新しい項目(カラム)を追加する方法

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

この記事では、EC-CUBE 4でデータベースを拡張する方法を、実例を交えつつ解説しています。

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

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

目次

商品データベースに『産地』を追加してみる

実際にデータベースを拡張する例として、商品データベース(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を実行。

このうち①は、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関数を定義しておくことで、データの読み書きができるようになる。

ProductTraitの格納先
作成したTraitファイルは「app/Customize/Entity」下にアップ

コマンドラインの操作

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をコピーしました!
目次