今回は非常に要望が多かった新しいテーブルを作ってエンティティとしてデータ取得をできるようにする方法をご紹介します。
この方法は3系のもので、まもなくリリースされるEC-CUBE4系では利用できませんのでご注意ください。
- データベースの作成
- ドクトリン定義ファイルの作成(dcm.ymlファイル)
- エンティティクラスファイルの作成
- レポジトリクラスの作成
- データの追加と取得
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()));
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。