Symfony Doctrine ORMのDQLを完全ガイド!初心者でもわかるDoctrine Query Languageの使い方
生徒
「Symfonyでデータベースを検索するときに使うDQLって何ですか?」
先生
「DQLはDoctrine Query Languageの略で、Doctrine専用の検索言語なんだ。」
生徒
「SQLとは違うんですか?なんだか難しそうです…。」
先生
「SQLに似ているけど、DQLはPHPのエンティティを扱うための言語なんだ。実は初心者でも理解しやすいように作られているから安心してね。」
1. DQL(Doctrine Query Language)とは?
DQLとは、SymfonyのDoctrine ORMでデータを検索するために使うDoctrine専用のクエリ言語です。SQLに似ていますが、テーブル名ではなくエンティティクラスを対象に検索を行う点が大きな特徴です。
初心者にもわかりやすく例えると、SQLが「データベースの部屋番号を指定して探す方法」だとすると、DQLは「PHPのオブジェクトとして探す方法」です。Symfonyの中で扱うのはエンティティなので、DQLはそれに特化した仕組みになっています。
たとえば、Userテーブルを検索するのではなく、Userエンティティを対象に検索するのでコードが直感的で理解しやすいのがポイントです。
2. DQLを使うメリットとは?
DQLを使うメリットはたくさんあります。SQLを書かずにエンティティの概念を使って検索できるため、Symfonyの初心者でもより安全で読みやすいコードになります。また、DQLはDoctrineと強く結びついているため、複雑な検索でも簡潔に書けるようになっています。
SQLでは実際のテーブル名を指定しますが、DQLではエンティティ名を使うため、データベースの構造を意識せずに検索を書けます。Symfonyが目指す「オブジェクト指向の開発」がそのまま検索にも生かされているわけです。
さらに、パラメータを使って安全に条件を指定できるため、初心者でもSQLインジェクションなどの危険な攻撃から守りながら検索を実行できるのも大きなメリットです。
3. DQLの基本的な書き方
DQLの基本的な構文はSQLととてもよく似ています。しかし、テーブル名ではなくエンティティ名とエイリアスを使います。エイリアスとは「短い呼び名」のことで、検索の中で便利に使える省略名です。
■ DQLの基本サンプル
$query = $entityManager->createQuery(
'SELECT u FROM App\Entity\User u WHERE u.age > :age'
)->setParameter('age', 20);
$result = $query->getResult();
このコードでは「Userエンティティの中からageが20より大きいデータを取得する」という検索をしています。SQLに似ていますが、「テーブル名」ではなくApp\Entity\Userを指定している点がポイントです。
また、:ageはパラメータで、後から値をセットすることで安全に検索できます。
4. 条件を複数指定したDQLの書き方
DQLでは、複数条件を組み合わせて柔軟に検索することができます。ANDやORといった条件もSQLと同じように使えます。
■ AND条件の例
$query = $entityManager->createQuery(
'SELECT u FROM App\Entity\User u
WHERE u.age >= :age AND u.role = :role'
)
->setParameter('age', 20)
->setParameter('role', 'admin');
$result = $query->getResult();
このコードでは「20歳以上で、roleがadmin」という複数の条件を指定しています。DQLは構文が分かりやすく、SQLを知らない初心者でも直感的に読みやすい点がメリットです。
5. ORDER BYやLIMITを使った並び替え・件数制限
DQLは並び替えや取得件数の制限にも対応しています。たとえば、最新のデータを上から順に5件だけ取得する、といった検索も簡単に書けます。
■ ORDER BY・LIMITの例
$query = $entityManager->createQuery(
'SELECT u FROM App\Entity\User u ORDER BY u.id DESC'
)
->setMaxResults(5);
$result = $query->getResult();
DQLではLIMITの代わりにsetMaxResultsを使います。SQLを知らない初心者でも理解しやすく、安全に件数制限を設定できます。
6. DQLを使うべきタイミングとは?
SymfonyにはfindやfindBy、findOneBy、そしてQueryBuilderがありますが、DQLは「もっと細かく検索を制御したいとき」に使われます。例えば、JOINを使って複数のテーブル(エンティティ)を結合する検索や、複雑な条件をまとめて書く場合に便利です。
日常生活に例えると、findやfindByは「単純な検索ができる図書館の検索機」、QueryBuilderは「複数条件の絞り込みができる検索フォーム」、そしてDQLは「検索の裏側まで全部自分で細かく指定できる高度な検索モード」のようなイメージです。
Symfonyでの開発では、最初はfind系を使い、慣れてきたらQueryBuilder、さらに複雑な場面ではDQLと段階的に使い分けることで、柔軟で強力な検索ができるようになります。