【PHP実践|実務向け】SymfonyにおけるORM活用術:Doctrine EntityManagerによるCRUD実装の基本

導入

現代のPHP開発において、フレームワークを用いたデータベース操作は避けて通れません。特にSymfonyフレームワークで採用されているDoctrine ORMは、SQLを直接記述することなく、オブジェクト指向の考え方でデータベースを操作できる強力なツールです。本記事では、DoctrineのEntityManagerを活用したCRUD(作成・読み取り・更新・削除)処理の実装方法を解説します。これを理解することで、データベース操作のコードが劇的に簡潔かつ保守しやすくなります。

基礎知識

Doctrineにおける「EntityManager」とは、データベースとのやり取りを仲介する「門番」のような存在です。データの永続化(保存)、削除、検索のすべてをこのクラスを通じて行います。また、「Repository」は特定のテーブルからデータを取得するための検索機能を提供します。これらを組み合わせることで、テーブル構造を意識した複雑なSQLを書く必要がなくなります。

実装/解決策

CRUDを実装する際は、以下のステップが基本となります。
1. 取得: Repositoryのfind()やfindAll()メソッドを使用。
2. 作成・更新: オブジェクトを作成/変更し、EntityManagerのpersist()で管理下に置く。
3. 反映: 最後にflush()を呼び出し、一括でSQLを発行する。

サンプルプログラム

以下は、Symfonyのコントローラー内で投稿データを保存・削除するための実用的なコード例です。

  • 新規投稿処理
  • /
    public function create(Request $request)
    {
    $post = new Post();
    $post->setTitle(‘新しい投稿’);
    $post->setCreatedAt(new \DateTime());

    // EntityManagerの取得
    $entityManager = $this->getDoctrine()->getManager();

    // データベースに保存するための準備(オブジェクトを管理下に入れる)
    $entityManager->persist($post);

    // 実際にSQLを発行してDBにコミット
    $entityManager->flush();

    return $this->json([‘status’ => ‘Created’]);
    }

    /

    • 投稿削除処理

    /
    public function delete($id)
    {
    $entityManager = $this->getDoctrine()->getManager();
    $post = $entityManager->getRepository(Post::class)->find($id);

    if (!$post) {
    throw $this->createNotFoundException(‘対象のデータが見つかりません’);
    }

    // 削除対象としてマーク
    $entityManager->remove($post);
    // 削除を実行
    $entityManager->flush();

    return $this->json([‘status’ => ‘Deleted’]);
    }
    }

    応用・注意点

    実務で特に注意すべき点は、flush()のタイミングです。persist()を呼んだだけではデータベースには保存されません。flush()を呼び出した瞬間に初めてSQLが発行されます。そのため、ループ処理の中で大量のデータを保存する際は、メモリ節約のために適切なタイミングでflush()を呼ぶなどの最適化が求められます。

    また、削除処理においては、直接削除するのではなく、論理削除(deleted_atカラムを更新するなど)を検討するケースも多いです。その場合、上記のようなremove()ではなく、通常の更新処理として実装する必要があります。現場の運用ルールに合わせて、最適な手法を選択してください。

    タイトルとURLをコピーしました