こんにちは、今回は
- データベースのテーブル定義から、エンティティを作成する方法。
- エンティティクラスを継承関係を用いて活用する方法。
を解説したいと思います。
既存のアプリケーションをSymfony2に移行する場合に役に立つのではないでしょうか?
データベースのテーブル定義から、エンティティを作成する方法
実は、既にあるデータベースからエンティティを生成する方法という公式ページですでに解説されています。
が、Annotationでエンティティを管理する場合、
php app/console doctrine:mapping:import --force AcmeBlogBundle xml
だとXmlファイルが作成されてしまい、annotationが無効となってしまう(xmlによる設定とanntationによる設定は共存できない)問題が発生してしまいます。
なので、
php app/console doctrine:mapping:convert annotation ./src --from-database --namespace="Acme\BlogBundle\Entity\\" php app/console doctrine:generate:entities AcmeBlogBundle
とした方が、初めからAnnotaion付きのエンティティが作成されるので、よいです。namespaceの最後のバックスラッシュの2重はダブルクォーテーションのエスケープを避け、バックスラッシュを文字列として認識させるためです。
結果、src/Acme/BlogBundle/Entity/にエンティティクラスが作成されます。
エンティティクラスを継承関係を用いて活用する方
エンティティは、Doctrine2では、PHPのクラスとして作成されています。したがって、継承など、PHPのクラスに用いられる方法が活用できます。
さて、これは活用方法の1例ではありますが、当社の社内システムにおけるDBのテーブルのカラムには基本的に
- 主キー(id)
- データの作成日時
- データの最終更新日時
が、大体のテーブルに含まれています。そして、そのカラム名はすべて、id,created_at,updated_atとなっています。これを、エンティティの継承で実現させてみましょう。
use Doctrine\ORM\Mapping as ORM; /** * @ORM\MappedSuperclass * @ORM\HasLifecycleCallbacks() */ class UtilEntity{ /** * @var bigint $id * * @ORM\Column(name="id", type="bigint", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ protected $id; /** * @var datetime $createdAt * * @ORM\Column(name="created_at", type="datetime", nullable=false) */ protected $createdAt; /** * @var datetime $updatedAt * * @ORM\Column(name="updated_at", type="datetime", nullable=true) */ protected $updatedAt; public function __construct($id = null){ $this->id = $id; } /** * Get id * * @return bigint */ public function getId() { return $this->id; } /** * Set createdAt * * @param datetime $createdAt */ public function setCreatedAt($createdAt) { $this->createdAt = $createdAt; } /** * @ORM\prePersist */ public function setCreatedValue() { $this->createdAt = new \DateTime(); } /** * Get createdAt * * @return datetime */ public function getCreatedAt() { return $this->createdAt; } /** * Set updatedAt * * @param datetime $updatedAt */ public function setUpdatedAt($updatedAt) { $this->updatedAt = $updatedAt; } /** * Get updatedAt * * @return datetime */ public function getUpdatedAt() { return $this->updatedAt; } /** * @ORM\prePersist * @ORM\preUpdate */ public function setUpdatedValue() { $this->updatedAt = new \DateTime(); } }
という、Utilなエンティティクラスを作成します。ポイントは
- @Entityを付与しないと@ORM\HasLifecycleCallbacks()がなぜか認識してくれない
- @Entityが存在するとき、必ず@Idを付与したプロパティが1つはないといけない
- @prepersist(Insert時)に現在の日時をcreated_atに挿入する(setCreatedValue)
- @prepersist(Insert時)、@preupdate(Update時)に現在の日時をupdated_atに挿入する(setUpdatedValue)
です。
Doctrineのイベントに関しては、http://docs.symfony.gr.jp/symfony2/book/doctrine.html#lifecycle-callbackを参考にしてください。
最後に、このUtilEntityクラスを継承した、エンティティクラスは、id,created_at,updated_atに関する記述をおこなう必要がなくなります。
もちろん、継承したエンティティを使い
php app/console doctrine:schema:update --force
とすれば、エンティティがid,created_at,updated_atを持っているので、正確なテーブルを作成することができるでしょう。
今回はこれで失礼いたします。
投稿者プロフィール
-
中の人には主に、
PHP・Symfony2系の人と
Ruby・Rails系の人がいます。
ときどきJavascript・データベースにも手を出すかもしれません。
最新の投稿
- データベース2015年2月3日Symfony2 Doctrine2の小ネタ(OneToMany,ManyToOneリレーション)
- データベース2015年1月28日Symfony2 Doctrine2の小ネタ(OneToOneリレーション)
- 開発2015年1月21日Symfony2でもデザインパターン(PHPクラス編)
- 開発2014年11月26日Google検索結果画面にパンくずリストを表示する方法 (リッチスニペット対応)