初めに
- PHP/Mysqlを使用して1年ほど
- SymfonyやLaravelを半年ずつほど
概要
初めてSymfonyを見たとき、なぜSQLではなくてORMという独自の方法で記載する必要があるのか?と思い調べたことや概要を備忘録として記事にしました。
1. ORMとは?
初めにSQLとORMは概要や構成がが違ったので、ORMについて調べました。
調べた内容はざっくり下記にまとめました。
RDBに対するデータの操作をオブジェクト指向型言語のやり方で扱えるようにするための手法、RDBに対する操作がカプセル化されたORM用のライブラリを使用し、ORMがSQLの生成などを背後で行ってくれます。
DBのテーブルはクラス(Entity)と紐づけられ、オブジェクトに対する操作をすることでデータの操作を行います。これにより、SQLを書く手間を省くことが可能です.
オブジェクト指向言語でSQLを実行することにより、PHP内での複数言語の混合が減り保守・運用に対してメリットが生まれます。
要するに、SQL文書くとPHP内にSQL言語混ざるからSQL文もPHPで書けたら良いよね!!って感じで覚えました。
細かく違いを分けると、返り値が違います。
SQL(PDO:query) = PDOStatement オブジェクト
ORM(findby) = Stdclassオブジェクト
返り値はオブジェクトで格納されるので、getter、setterなどを使用する認識です。
自分が使用したSymfony4ではgetter/setterをEntityファイルに記載していました。
テーブルごとにEntityファイルを作成し、ORMで取得したオブジェクトから値を取得するイメージです。
ORMを使用して取得したオブジェクトですが値が取得できなければデータとして活用しずらいですね、、
Entity内に該当テーブルのgetter/setterを定義することで値の取得や差込を行えます。
ん?そもそもEntityとは何かよく理解していなかったので調べました。
Entityとは、テーブルとリンクしたModel(モデル)になっておりEntityからデータの作成や削除を行うことができるようになります。
ざっくりですが、Entityを使用し、DBテーブルとマッピングすることで各カラムを定義でき、定義した値をもとにデータの取得や生成を可能にする認識です。
※Symfony自体はテーブル情報を知らないので、Entityを使用し辞書のように参照しているイメージでしょうか。
3. データの取得方法
ORMを用いてデータを取得する方法一覧です、
環境のDoctrinバージョンによって使用できない場合がありますので注意です。
- PK(主キー)で取得:find
- 条件一致するものを取得:findBy
- 条件一致する1件を取得:findOneBy
- 全権取得:findAll
参考に、取得先DBテーブル:membertableを作成し取得結果も記載します。
id:1 name:山本 Gender:MALE
id:2 name:田中 Gender:FEMALE
id:3 name:木村 Gender:MALE
Doctrine使用時
Controller内でDoctrineを使用するにはEntityManagerを取得する必要があるので先に下記定義が必要です。
$em = $this->getDoctrine()->getManager();
PK(主キー)で取得:find()
$id = 1;
$memberlist = $em->getRepository(member::class)->find($id);
取得結果(memberlist)
id:1 name:山本 Gender:MALE
条件一致するものを取得:findBy()
$Gender = MALE;
$memberlist = $em->getRepository(member::class)->findBy([ 'Gender' => $Gender, ]);
取得結果(memberlist)
id:1 name:山本 Gender:MALE
id:3 name:木村 Gender:MALE
条件一致する1件を取得:findOneBy
findOneByでは該当結果が複数あった場合、最初の1件を取得します。
$Gender = MALE;
$memberlist = $em->getRepository(member::class)->findOneBy([ 'Gender' => $Gender, ]);
取得結果(memberlist)
id:1 name:山本 Gender:MALE
全権取得:findAll
$memberlist = $em->getRepository(member::class)->findAll();
取得結果(memberlist)
id:1 name:山本 Gender:MALE
id:2 name:田中 Gender:FEMALE
id:3 name:木村 Gender:MALE
まとめ
- ORMを使用することでPHP内での別言語を混在させずにクエリが行える
- クエリ条件のみ変更させればよいのでSQLを知らないメンバーや開発者でも変更が容易
- SQL文のMIXやIN、NOT、JOIN句など細かい条件を指定できない為複雑なクエリには向いていない