Closed2

永遠にDoctrineがわからない問題を解決する

こまきちこまきち

EC-CUBEを学習する時、何度やってもDoctrineの知識を忘れてしまうので、書き留めておく。
(Doctrineって名前がいかつくて毎回怖気付く…)

Doctrineとは

Symfonyで利用されているORM*(リレーショナルマッパー)
この仕組みにより、RDBのテーブルやSQLをほとんど意識せずに、直接オブジェクトとして保存や取得することができる。
*ORM = RDB(リレーショナルデータベース)から取得した情報を、特定のクラスと関連づけてオブジェクト化する仕組み

使用目的

リレーショナルデータベースの永続性の観点から、ドメインやビジネスロジックを分離すること

実現できること

DBのテーブルとSymfonyのEntity間でデータのマッピングを行うことができる。
SymfonyのEntityに @ORM\Annotaion のようにデータマッピング設定を書くことで、Doctrineがマッピングを行ってくれる。

【参考】Symfony2で利用されている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日の中で私が何を勘違いしていたかを残しておく。
(もしかしたらまだ勘違いしているかもしれない)

  1. EntityとEntityManger、どっちも登録みたいなことしてて違いがわからない
  2. Entityってテーブル作ってるん?
  3. 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と併用することもある。

このスクラップは2023/07/23にクローズされました