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->getQuery()->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->getQuery()->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に欲しい関数がない場合は、自作で関数を作ることも出来るので作ってみてください
関連記事
- symfonyを触り始めた人へのDoctrine(ORM)入門
- symfonyを触り始めた人へのDoctrine(ORM)入門2
- symfonyを触り始めた人へのDoctrine(ORM)入門3
- symfonyを触り始めた人へのDoctrine(ORM)入門4(表示中)