永遠にDoctrineがわからない問題を解決する
EC-CUBEを学習する時、何度やってもDoctrineの知識を忘れてしまうので、書き留めておく。
(Doctrineって名前がいかつくて毎回怖気付く…)
Doctrineとは
Symfonyで利用されているORM*(リレーショナルマッパー)
この仕組みにより、RDBのテーブルやSQLをほとんど意識せずに、直接オブジェクトとして保存や取得することができる。
*ORM = RDB(リレーショナルデータベース)から取得した情報を、特定のクラスと関連づけてオブジェクト化する仕組み
使用目的
リレーショナルデータベースの永続性の観点から、ドメインやビジネスロジックを分離すること
実現できること
DBのテーブルとSymfonyのEntity間でデータのマッピングを行うことができる。
SymfonyのEntityに @ORM\Annotaion
のようにデータマッピング設定を書くことで、Doctrineがマッピングを行ってくれる。
Entity, Repository, EntityManagerについていつも忘れてしまう。
この3つの仕組みが初学者にとっては本当に難しく感じる…
- Entity:データベースのテーブルを扱うクラス。
- Repository:Repositoryを利用すればEntityを取得することができる。データを取得することができるってこと。
- EntityManager:Repositoryの取得やEntityの永続化(挿入)を行う機能を提供する
うーん。EntityとEntityManagerの違いがちゃんと説明できないくらいに、よくわかってません。
ぼんやり見えた。霞むほどに。
違いをもっとわかりやすく
Entity → DBオブジェクト
Repository → Entityへのアクセスを行うための入口
EntityManager → Entityにまつわる操作を実行する機能群
参考→ https://stackoverflow.com/questions/37534945/symfony-doctrine-entity-manager-and-repository
この3つについて勘違いしていたこと
上記3つの違いを理解するまで丸1日かかった。。1日の中で私が何を勘違いしていたかを残しておく。
(もしかしたらまだ勘違いしているかもしれない)
- EntityとEntityManger、どっちも登録みたいなことしてて違いがわからない
- Entityってテーブル作ってるん?
- RepositoryとEntityManagerの違いがわからない
1. EntityとEntityManger、どっちも登録みたいなことしてて違いがわからない
これは2つについての知識が足りなさすぎたせいで勘違いした。
Entityはコードを見るのが一番わかりやすいが、変数やgetter, setterを定義している。
EntityManagerは大体 $this->entityManager->persist($hoge);
みたいな感じで書かれている。
ここからわかることは、何やらEntityはDBっぽい働きをしていて、EnitityManagerはDBに書き込んでいるよう。
ぼんやりとしかわからないけど、そんなイメージ
2. Entityってテーブル作ってるん?
1で定義をしていると書いたが、このドキュメントを見ると何やらテーブルを作成している。
ここから私はEntityはテーブルを作るものだと思ったが、これは違う。
Entityはあくまでオブジェクトであり、
bin/console doctrine:schema:update --dump-sql --force
このようなコマンドでテーブルがない場合にデータベースがテーブルを作ってくれている。
つまりEntity自体は、テーブルを作成する機能はない。
RepositoryとEntityManagerの違いがわからない
これは正直結構悩んだ。どちらもEntityからデータを取得・更新できる。
何が違う?
ヒントはstackoverflowにあった。
大雑把に言えば、
EntityManagerはEntityオブジェクトを永続化する際や削除する際に使用。ただクエリを作成できてもEntityManager自体にクエリを含めることはできない。
Repositoryはエンティティへのアクセスを定義してデータをフェッチすることができる。EntityManagerと併用することもある。