symfonyを触り始めた人へのDoctrine(ORM)入門

初めまして、新卒で入社しました木戸です。

兵庫の田舎から福岡に来て福岡の便利さと豚骨ラーメンの匂いに毎日驚きながら過ごしています。

オススメのお店、ラーメン屋があれば教えてください!

では、本題のsymfonyのORMであるDoctrineについての勉強会を行ったのでシェアします。

ORMとは

ORM(オブジェクトリレーショナルマッピング)はRDM(リレーショナルデータベース)に対するデータ操作をオブジェクト指向型言語のやり方で扱えるようにするための手法です。

ORMのメリット

  1. SQLを書かなくてよい→別言語を混在させずに済む 
  2. 質のいいSQLが生成される
  3. オブジェクト指向型言語で書ける

Doctrineの使用方法

Controller内でDoctrineを使用するにはEntityManagerを取得する必要があるので

$em = $this->getDoctrine()->getManager();

と定義します。

Controller内で書き方

$em->getRepository(リポジトリ名::class)->関数();
 

データの取得方法(基礎編)

peopleに登録されているデータ(主キーはid)

id:1 name:田中 age:22
id:2 name:山田 age:22
id:3 name:山中 age:30

プライマリーキー(主キー)で取得 find

$id = 1; 
$peopleList = $em->getRepository(people::class)->find($id);
取得結果(peopleList)
id:1 name:田中 age:22

()内と合うものを取得(プライマリーキー以外) findBy

$age= 22;
$peopleList = $em->getRepository(people::class)->findBy([ 'age' => $age, ]);
取得結果
id:1 name:田中 age:22
id:2 name:山田 age:22

()内と合うものを1件取得 findOneBy

$name= '山中'; 
$peopleList = $em->getRepository(people::class)->findOneBy( 'name' => $name, );
取得結果
id:3 name:山中 age:30
※該当するものが複数あった場合は、最初の1件が返ってきます

全件取得 findAll

$peopleList = $em->getRepository(people::class)->findAll();
取得結果
id:1 name:田中 age:22
id:2 name:山田 age:22
id:3 name:山中 age:30

登録

$form = $this->createForm(peopleListFormType::class, $people);
if($this->isPost()) {
  $form->handleRequest($request);
  if ($form->isSubmitted()) {
     if ($form->isValid()) {
         $em->beginTransaction();
         try {
            $em->persist($people);
            $em->flush();
            $em->commit();
         } catch (\Exception $e) {
            $em->rollBack();
            $em->close();
         }
   }
  }
}

削除

try {
       $em->remove($people); 
       $em->flush(); 
    } catch (\Exception $e) { 
       $em->rollBack(); 
       $em->close(); 
    }

このように、Doctrineを使用することでデータの取得、登録、削除を簡単に行うことができます。

次のステップとして、クエリビルダーを使用してデータを自分の欲しい形にカスタマイズして取得する方法があるのですが、また次回書こうと思います。

どうしても知りたいという方は、こちらをご確認ください。