今回は非常に要望が多かった新しいテーブルを作ってエンティティとしてデータ取得をできるようにする方法をご紹介します。
この方法は3系のもので、まもなくリリースされるEC-CUBE4系では利用できませんのでご注意ください。

  1. データベースの作成
  2. ドクトリン定義ファイルの作成(dcm.ymlファイル)
  3. エンティティクラスファイルの作成
  4. レポジトリクラスの作成
  5. データの追加と取得

1. データベースの作成

マイグレーションでもphpMyAdminでもschema updateでも構わないので、とにかくテーブルを作成します。

create table if not exists dtb_test
(
	test_id int auto_increment comment 'ID' primary key,
	name longtext not null,
        rank smallint not null comment '表示順',
	create_date datetime not null,
            update_date datetime not null,
        del_flg smallint(6) default '0' not null comment '削除フラグ',
)
;

 

2. ドクトリン定義ファイルの作成(dcm.ymlファイル)

データベースからエンティティに同期するカラムの情報を記載します。

Eccube\Entity\Test:
    type: entity
    table: dtb_test
    repositoryClass: Eccube\Repository\TestRepository
    id:
        id:
            type: integer
            nullable: false
            unsigned: false
            id: true
            column: test_id
            generator:
                strategy: AUTO
    fields:
        name:
            type: text
            nullable: false
        rank:
            type: smallint
            nullable: false
            unsigned: false
        create_date:
            type: datetime
            nullable: false
        update_date:
            type: datetime
            nullable: false
        del_flg:
            type: smallint
            nullable: false
            unsigned: false
            options:
                default: '0'
    lifecycleCallbacks: {  }

3. エンティティクラスファイルの作成

src/Eccube/Entity/Test.phpを作成します。

dcm.ymlで定義したカラムをprivateなプロパティとして設定し、それぞれゲッターセッターを用意します。

<?php

namespace Eccube\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Test
 */
class Test extends \Eccube\Entity\AbstractEntity
{
    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    private $name;

    /**
     * @var integer
     */
    private $rank;

    /**
     * @var \DateTime
     */
    private $create_date;

    /**
     * @var \DateTime
     */
    private $update_date;

    /**
     * @var integer
     */
    private $del_flg = '0';


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

    /**
     * Set name
     *
     * @param string $name
     * @return Test
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set rank
     *
     * @param integer $rank
     * @return Test
     */
    public function setRank($rank)
    {
        $this->rank = $rank;

        return $this;
    }

    /**
     * Get rank
     *
     * @return integer 
     */
    public function getRank()
    {
        return $this->rank;
    }

    /**
     * Set create_date
     *
     * @param \DateTime $createDate
     * @return Test
     */
    public function setCreateDate($createDate)
    {
        $this->create_date = $createDate;

        return $this;
    }

    /**
     * Get create_date
     *
     * @return \DateTime 
     */
    public function getCreateDate()
    {
        return $this->create_date;
    }

    /**
     * Set update_date
     *
     * @param \DateTime $updateDate
     * @return Test
     */
    public function setUpdateDate($updateDate)
    {
        $this->update_date = $updateDate;

        return $this;
    }

    /**
     * Get update_date
     *
     * @return \DateTime 
     */
    public function getUpdateDate()
    {
        return $this->update_date;
    }

    /**
     * Set del_flg
     *
     * @param integer $delFlg
     * @return Test
     */
    public function setDelFlg($delFlg)
    {
        $this->del_flg = $delFlg;

        return $this;
    }

    /**
     * Get del_flg
     *
     * @return integer 
     */
    public function getDelFlg()
    {
        return $this->del_flg;
    }
}

 

4. レポジトリクラスファイルの作成

src/Eccube/Repository/TestRepository.phpを作成します。

最初は空っぽで構いませんが、システムの開発に応じてエンティティの取得・更新を行うメソッドを追加していきます。

<?php

namespace Eccube\Repository;

use Doctrine\ORM\EntityRepository;

/**
 * TestRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class TestRepository extends EntityRepository
{
}

 

これでデータベースとエンティティの紐付けは完了です。Testエンティティを使用してdtb_testテーブルへデータを登録したり、$app[‘orm.em’]->getRepository(‘Eccube\Entity\Test’)->find(1)といったようにデータの取得が可能になります。

5. データの追加と取得

マイグレーション等で1つデータを追加してみましょう。dtb_testにID1の行が追加されます。マイグレーションが作成できない場合phpMyAdminから追加すれば同じことです。

$app = \Eccube\Application::getInstance();
$Test = new \Eccube\Entity\Test();
$Test->setName('test')
->setRank(1)
->setDelFlg(0);
$app['orm.em']->persist($Test);
$app['orm.em']->flush($Test);

TopController::indexメソッドあたりに次のコードを書いてみてください。トップページの画面にデータが表示されていれば成功です。

dump($app[‘orm.em’]->getRepository(‘Eccube\Entity\Test’)->findOneBy(array()));