EC-CUBEシリーズ！「Doctrineで新規テーブル作成」

![EC-CUBE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633992/9581644b-2b37-1028-9e9b-137b50556857.jpeg)

エスプリフォートでは、ECによる請負開発やプロダクト（自社サービス）開発は長く行っており、その中の一つとしてEC-CUBEももちろん取り扱ってきました。

このEC-CUBEやEC-CUBEのアドオン開発に関することをご紹介していきます。

## アドオン開発では必須のテーブルの新規作成
今回はEC-CUBEでテーブルを新規作成する方法をご紹介します。

テーブルを作成するためには、EntityクラスとRepositoryクラスを作る必要があります。
EC-CUBEではテーブル定義をEntityクラスでアノテーションとして定義するO/R Mapperが取り入れられています。

EC-CUBEではO/R MapperとしてDoctrineが採用されています。
※アプリケーションフレームワークはsymfonyを採用しています。

このDoctrineを利用して「dtb_test」というテーブルを作成してみましょう。

## １、Entityクラスの作成しよう！
「[インストールディレクトリ]/app/Customize/Entity」に「Test.php」を追加し、下記コードを書きます。
※PHPのファイル名と下記コードの「Test」の部分を自分で作るテーブル名で書くようにしてください。
※新たに作るテーブル名等のテーブルに関する定義を、クラスのアノテーションに設定してください。
※フィールド変数がテーブルのカラムとなりますので、カラムと同じ名前のフィールドとフィールドに対するGETTER、SETTERのメソッドを作り、フィールドのアノテーションにはカラムの定義を設定してください。

```php5
<?php

namespace Customize\Entity;

use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation as Eccube;
use Symfony\Component\Validator\Constraints as Assert;

if (!class_exists('\Customize\Entity\Test')) {
    /**
     * メッセージテーブル
     *
     * @ORM\Table(name="dtb_test", options={"comment":"テストテーブル"})
     * @ORM\InheritanceType("SINGLE_TABLE")
     * @ORM\DiscriminatorColumn(name="discriminator_type", type="string", length=255)
     * @ORM\HasLifecycleCallbacks()
     * @ORM\Entity(repositoryClass="Customize\Repository\TestRepository")
     */
    class Test extends \Eccube\Entity\AbstractEntity
    {
        /**
         * 代理キー
         *
         * @var int
         *
         * @ORM\Column(name="id", type="integer", options={"unsigned":true, "comment":"ID"})
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;

        /**
         * 会員ID
         *
         * @var int
         *
         * @ORM\Column(name="customer_id", type="integer", nullable=false, options={"comment":"会員ID"})
         */
        private $custmer_id;

        /**
         * タイトル
         *
         * @var string|null
         *
         * @ORM\Column(name="title", type="string", length=255, nullable=true, options={"comment":"タイトル"})
         */
        private $title;

        /**
         * 最終送信日時
         *
         * @var last_send_date
         *
         * @ORM\Column(name="last_send_date", type="datetimetz", nullable=false, options={"comment":"最終送信日時"})
         */
        private $last_send_date;

        /**
         * Get id.
         *
         * @return int
         */
        public function getId()
        {
            return $this->id;
        }

        /**
         * Set 会員ID
         *
         * @param int $customer_id
         *
         * @return Message
         */
        public function setCustomerId($customer_id)
        {
            $this->customer_id = $customer_id;

            return $this;
        }

        /**
         * Get 会員ID
         *
         * @return int
         */
        public function getCustomerId()
        {
            return $this->customer_id;
        }

        /**
         * Set タイトル
         *
         * @param string $title
         *
         * @return Message
         */
        public function setTitle($title)
        {
            $this->title = $title;

            return $this;
        }

        /**
         * Get タイトル
         *
         * @return string
         */
        public function getTitle()
        {
            return $this->title;
        }

        /**
         * Set 最終送信日時
         *
         * @param datetimetz $lastSendDate
         *
         * @return Message
         */
        public function setLastSendDate($lastSendDate)
        {
            $this->last_send_date = $lastSendDate;

            return $this;
        }

        /**
         * Get 最終送信日時
         *
         * @return datetimetz
         */
        public function getLastSendDate()
        {
            return $this->last_send_date;
        }
    }
}
```

## ２、Repositoryを作成してみよう！
次に「[インストールディレクトリ]/app/Customize/Repository」に、「TestRepository.php」を追加し、下記コードを書きます。
※PHPのファイル名と下記コードの「Test」の部分を自分で作るテーブル名で書くようにしてください。

```php5
<?php

namespace Customize\Repository;

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

/**
 * Messageテーブルリポジトリ
 */
class TestRepository extends AbstractRepository
{
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, Test::class);
    }
}
```

## ３、EC-CUBEのコマンド実行でテーブルを自動生成してみよう！

下記コマンドを実行することにより、エンティティのアノテーションに提議したテーブル定義で、DBにテーブルが自動で生成されます。

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

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

## 最後に
これでテーブルの新規作成は完了です。

ぜひEC-CUBEでのアドオン開発にて生かして頂ければと思います。

https://www.esprit-fort.co.jp/


https://www.esprit-fort.co.jp/recruit/