導入
現代の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()ではなく、通常の更新処理として実装する必要があります。現場の運用ルールに合わせて、最適な手法を選択してください。