【EC-CUBE4】新規テーブル&カラム追加方法

#PHP
written by みよしや

こんにちは、みよしやです。

今回は、EC-CUBE4.1を使用して、新規テーブル作成と既存テーブルへのカラム追加方法を書いていきます。

既存テーブルへのカラム追加方法

カラムを追加するには、対象のEntityクラスを拡張するtraitという機能を使用します。
まずは、traitの定義方法と使用方法をご紹介します。

// traitの定義(変数や関数の書き方はclassの場合と変わりません)
trait SampleTrait {
     // 処理
}

// traitの使用(useで読み込むことで、SampleTrait内の関数を使用することができます。
class SampleClass {
     use [パス]\SampleTrait;
}

[traitの定義・使用例]

traitの作成

では実際にtraitの作成を行っていきます。
会員テーブル(dtb_customer)にFAX番号カラム(fax_number)を追加する例で説明します。
app\Customize\EntityにCustomerTrait.phpを作成します。

<?php

namespace Customize\Entity;

use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation\EntityExtension;

/**
 * @EntityExtension("Eccube\Entity\Customer")
 */
trait CustomerTrait
{
    /**
     * @var string|null
     *
     * @ORM\Column(name="fax_number", type="string", length=14, nullable=true)
     */
    private $fax_number;

    /**
     * Set fax_number.
     *
     * @param string|null $fax_number
     *
     * @return CustomerTrait
     */
    public function setFaxNumber($fax_number = null)
    {
        $this->fax_number = $fax_number;

        return $this;
    }

    /**
     * Get fax_number.
     *
     * @return string|null
     */
    public function getFaxNumber()
    {
        return $this->fax_number;
    }
}

変数やgetter,setterの定義方法はEntityクラスと同一のため、
拡張元のクラス(今回はCustomer.php)を参考にしてみてください。

proxyファイルの生成

php [EC-CUBEインストールディレクトリ]/bin/console eccube:generate:proxies

traitの作成が完了したら、コマンドでproxyファイルの生成を行います。

    class Customer extends \Eccube\Entity\AbstractEntity implements UserInterface, \Serializable
    {
         use \Customize\Entity\CustomerTrait;

上記のように、先ほど作成したCustomerTraitがuseで読み込まれていれば成功です。

DB反映コマンドの実行

// キャッシュクリア
php [EC-CUBEインストールディレクトリ]/bin/console cache:clear --no-warmup

// テーブル追加SQL実行('--force'を付けずに叩くと、実行予定のSQL文が表示されます)
php [EC-CUBEインストールディレクトリ]/bin/console eccube:schema:update --dump-sql --force

最後に、上記コマンドでDBに反映させたらカラム追加完了となります。

 

新規テーブルの作成方法

今度は新規のテーブルを作成する方法をご紹介します。

テーブル作成には、EntityとRepositoryが必要となります。
今回はdtb_sampleというテーブルを作成してみます。

Entityの作成

<?php

/*
 * This file is part of EC-CUBE
 *
 * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
 *
 * http://www.ec-cube.co.jp/
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Customize\Entity;

use Doctrine\ORM\Mapping as ORM;

if (!class_exists('\Customize\Entity\Sample')) {
    /**
     * Sample
     *
     * @ORM\Table(name="dtb_sample")
     * @ORM\InheritanceType("SINGLE_TABLE")
     * @ORM\DiscriminatorColumn(name="discriminator_type", type="string", length=255)
     * @ORM\HasLifecycleCallbacks()
     * @ORM\Entity(repositoryClass="Customize\Repository\SampleRepository")
     */
    class Sample extends \Eccube\Entity\AbstractEntity
    {
        /**
         * @var int
         *
         * @ORM\Column(name="sample_column01", type="integer", options={"unsigned":true})
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="NONE")
         */
        private $sample_column01;

        /**
         * @var int
         *
         * @ORM\Column(name="sample_column02", type="integer", options={"unsigned":true})
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="NONE")
         */
        private $sample_column02;
        /**
         * Set sampleColumn01.
         *
         * @param int $sampleColumn01
         *
         * @return Sample
         */
        public function setSampleColumn01($sampleColumn01)
        {
            $this->sample_column01 = $sampleColumn01;

            return $this;
        }

        /**
         * Get sampleColumn01.
         *
         * @return int
         */
        public function getSampleColumn01()
        {
            return $this->sample_column01;
        }

        /**
         * Set sampleColumn02.
         *
         * @param int $sampleColumn02
         *
         * @return Sample
         */
        public function setSampleColumn02($sampleColumn02)
        {
            $this->sample_column02 = $sampleColumn02;

            return $this;
        }

        /**
         * Get sampleColumn02.
         *
         * @return int
         */
        public function getSampleColumn02()
        {
            return $this->sample_column02;
        }
    }
}

まずはapp\Customize\EntityにSample.phpを追加します。

Repositoryの作成

<?php

/*
 * This file is part of EC-CUBE
 *
 * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
 *
 * http://www.ec-cube.co.jp/
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Customize\Repository;

use Customize\Entity\Sample;
use Eccube\Repository\AbstractRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;

/**
 * SampleRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class SampleRepository extends AbstractRepository
{
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, Sample::class);
    }
}

次にapp\Customize\RepositoryにSampleRepository.phpを追加します。

DB反映コマンドの実行

// キャッシュクリア
php [EC-CUBEインストールディレクトリ]/bin/console cache:clear --no-warmup

// テーブル追加SQL実行('--force'を付けずに叩くと、実行予定のSQL文が表示されます)
php [EC-CUBEインストールディレクトリ]/bin/console eccube:schema:update --dump-sql --force

そしてカラム追加の時と同様に、上記コマンドを実行するとDBに反映されます。

 

最後に

EC-CUBEをカスタマイズする際、既存テーブルだけでは実装が難しい場合がありましたら、
今回の記事を参考に、独自のテーブルやカラムの追加を検討してみてはいかがでしょうか。

ご覧いただきありがとうございました。