symfonyを触り始めた人へのDoctrine(ORM)入門3 クエリビルダ編

こんにちは。木戸です。

前回前々回とController内でDoctrineを使用する方法について書いてきました

今回はクエリビルダを使ってRepositoryでデータを取得する方法を書いていきます

クエリビルダとは

クエリビルダ(QueryBuilder)は、SymfonyのDoctrine ORMで提供される機能の一つであり、データベースクエリを動的に構築するための強力なツールです。クエリビルダを使用することで、柔軟な条件指定や複雑なクエリの作成が可能となります。

ざっくり言うと、クエリビルダはphpで記載されたコードからSQLを生成、発行してくれる機能だと思ってください。

個人的には、クエリビルダを使うメリットはデータを取得する際にSQLを書かなくていいことだと思います。

実際にクエリビルダを使ったデータの取得

クエリビルダを使うために、クエリビルダを取得します。

$queryBuilder = $this->createQueryBuilder('alias');

‘alias’の部分はファイルに合わせて都度変更してください。

クエリビルダで使える関数の例

  1. where(): WHERE句を追加します。
  2. andWhere(): WHERE句にAND条件を追加します。
  3. orWhere(): WHERE句にOR条件を追加します。
  4. select(): SELECT句に追加するカラムを指定します。
  5. addSelect(): SELECT句に追加するカラムを指定します。
  6. join(): JOIN句に追加するテーブル名とJOIN条件を指定します。
  7. leftJoin(): LEFT JOIN句に追加するテーブル名とJOIN条件を指定します。
  8. innerJoin(): INNER JOIN句に追加するテーブル名とJOIN条件を指定します。
  9. groupBy(): GROUP BY句に追加するカラム名を指定します。
  10. having(): HAVING句に追加する条件を指定します。
  11. orderBy(): ORDER BY句に追加するカラム名と並び順を指定します。

他にも関数があるので詳しく知りたい方はこちらを確認してください

上記のいくつかの関数の使い方を紹介します

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

id:1,  lastName:佐藤, firstName:太一,  age:31
id:2,  lastName:佐藤, firstName:太郎,  age:41
id:3,  lastName:佐藤, firstName:俊一郎, age:21
id:4,  lastName:佐藤, firstName:翔,   age:21
id:5,  lastName:鈴木, firstName:一郎,  age:51
id:6,  lastName:鈴木, firstName:次郎,  age:46
id:7,  lastName:鈴木, firstName:三郎,  age:41
id:8,  lastName:高橋, firstName:大輝,  age:21
id:9,  lastName:高橋, firstName:海斗,  age:22
id:10, lastName:高橋, firstName:拓海,  age:23

where()

andWhereとorWhereも同じ書き方をします

$name= '郎'; 
$queryBuilder = $this->createQueryBuilder('p');
$queryBuilder->where('p.firstName like :firstName');
$queryBuilder->setParameter('firstName', '%'.$name.'%');
$results = $queryBuilder-&gtgetQuery()->getResult();
取得結果
id:2, lastName:佐藤, firstName:太郎,  age:41
id:3, lastName:佐藤, firstName:俊一郎, age:21
id:5, lastName:鈴木, firstName:一郎,  age:51
id:6, lastName:鈴木, firstName:次郎,  age:46
id:7, lastName:鈴木, firstName:三郎,  age:41

firstNameに’郎’を含んでいるユーザーを取得できました。

groupBy()

groupByは同じ値をグループ化する関数です

$queryBuilder = $this->createQueryBuilder('p');
$queryBuilder->groupBy('p.lastName);
$results = $queryBuilder-&gtgetQuery()->getResult();
取得結果
id:4, lastName:佐藤, firstName:翔,   age:21
id:7, lastName:鈴木, firstName:三郎,  age:41
id:10, lastName:高橋, firstName:拓海,  age:23

lastNameでグループ化したため、10件あったデータが苗字でまとまり3件取得できました。

innerJoin()

Joinのために1テーブル追加します。

電話番号テーブル tell

id:1,  people_id:1,  num:090-000-0001
id:2,  people_id:1,  num:080-000-0001
id:3,  people_id:2,  num:090-000-0002
id:4,  people_id:2,  num:080-000-0002
id:5,  people_id:3,  num:090-000-0003
id:6,  people_id:4,  num:090-000-0004
id:7,  people_id:5,  num:080-000-0005
id:8,  people_id:6,  num:080-000-0006
id:9,  people_id:7,  num:080-000-0007
id:10, people_id:8,  num:080-000-0008

leftJoinとrightJoinも同じ書き方をします

$queryBuilder = $this->createQueryBuilder('p');
$qb->innerJoin(TELL::class,'t',Join::WITH,'p.id= t.people_id);
$queryBuilder->where('t.num like :num');
$queryBuilder->setParameter('num', '090%');
$results = $queryBuilder-&gtgetQuery()->getResult();
取得結果
id:1, lastName:佐藤, firstName:太一,  age:31
id:2, lastName:佐藤, firstName:太郎,  age:41
id:3, lastName:佐藤, firstName:俊一郎, age:21
id:4, lastName:佐藤, firstName:翔,   age:21

peopleに紐づく電話番号(num)が’090’のデータを取得できました。

このように、クエリビルダを使うことで、少し複雑な条件でデータを取得することができます

どんどんクエリビルダを使っていきましょう!

関連記事