1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-03-28

EC-CUBE.jpg

エスプリフォートでは、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」というテーブルを作成してみましょう。

1、Entityクラスの作成しよう!

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

<?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;
        }
    }
}

2、Repositoryを作成してみよう!

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

<?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);
    }
}

3、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でのアドオン開発にて生かして頂ければと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?