今回は非常に要望が多かった新しいテーブルを作ってエンティティとしてデータ取得をできるようにする方法をご紹介します。
この方法は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を使っている方は適切なタイミングでバージョンアップをご検討ください。
EC-CUBEゴールドパートナー