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

こんにちは。木戸です。

今回はクエリビルダを拡張してSQL関数を使う方法について書いていきます

なぜクエリビルダの拡張が必要か

前回の記事で紹介した関数(joinやgrouoBy)はDoctrine標準で組み込まれている関数です。

それ以外のSQL関数を使う場合は、クエリビルダを拡張する必要があります。

今回はクエリビルダを拡張するライブラリを導入して、SQL関数を使う手順を紹介します。

環境 symfony5.4 
データベース MYSQL

ライブラリの導入手順

1. composerを使用して、DoctrineExtensionsをインストール

composer require beberlei/doctrineextensions=dev-master

2. config\packages\doctrine.yamlの1行目にDoctrineExtensionsの関数定義ファイルをインポート


# doctrineExtensionsのmysql関数をインポート
imports:
  - { resource: '../../vendor/beberlei/doctrineextensions/config/mysql.yml' }

これで、DoctrineExtensionsで定義してある関数を使えるようになります。

使える関数は、DoctrineExtensionsのREADMEを確認してください。

実行例

今回は、MYSQLのREPLACE()関数を例に紹介します

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

id:1,  lastName:佐藤, firstName:太一,  tell:031-2345-6789
id:2,  lastName:佐藤, firstName:太郎,  tell:080-1234-5678
id:3,  lastName:佐藤, firstName:俊一郎, tell:090-9876-5432
id:4,  lastName:佐藤, firstName:翔,   tell:042-3456-7890
id:5,  lastName:鈴木, firstName:一郎,  tell:070-1111-2222
id:6,  lastName:鈴木, firstName:次郎,  tell:052-9876-5432
id:7,  lastName:鈴木, firstName:三郎,  tell:080-9876-5432
id:8,  lastName:高橋, firstName:大輝,  tell:090-1111-2222
id:9,  lastName:高橋, firstName:海斗,  tell:080-2222-3333
id:10, lastName:高橋, firstName:拓海,  tell:090-3333-4444

“12”と連続している電話番号を取り出したい場合にREPLACE()関数を使わず記載すると

$tell= '12'; 
$queryBuilder = $this->createQueryBuilder('p');
$queryBuilder->where('p.tell like :tell');
$queryBuilder->setParameter('tell', '%'.$tell.'%');
$results = $queryBuilder-&gtgetQuery()->getResult();
取得結果
id:2, lastName:佐藤, firstName:太郎,  tell:080-1234-5678

となり、”-“が入っている、”1111-2222″の電話番号が対象外になってします。

REPLACE()関数を使って記載すると

$tell= '12'; 
$queryBuilder = $this->createQueryBuilder('p');
$queryBuilder->where('REPLACE(p.tell,"-","") like :tell'); //電話番号の"-"を取り除く
$queryBuilder->setParameter('tell', '%'.$tell.'%');
$results = $queryBuilder-&gtgetQuery()->getResult();
取得結果
id:1, lastName:佐藤, firstName:太一,  tell:031-2345-6789
id:2, lastName:佐藤, firstName:太郎,  tell:080-1234-5678
id:5, lastName:鈴木, firstName:一郎,  tell:070-1111-2222
id:8, lastName:高橋, firstName:大輝,  tell:090-1111-2222

となり、”-“を取り除いた状態で12と連続する電話番号をもつユーザーを取得できました。

このように、クエリビルダを拡張し、SQL関数をクエリビルダで記することで、発行されるSQLの質を保てます。

DoctrineExtensionsに欲しい関数がない場合は、自作で関数を作ることも出来るので作ってみてください

関連記事