はじめに
駆け出しエンジニア2年目のtakaと申します、symfonyの日本語ドキュメントが少なすぎて困ることが多かったので備忘録として記事にしました。
初めて書くので至らないところが多いですが同じような方の助けになれば幸いです。
目次
対象者
この記事は下記のような人を対象にしています。
- 駆け出しエンジニア
- プログラミング初学者
- PHP技術者(symfony4)
- DQLについて知見、使用したことがある
環境
- PHP7
- symfony4
経緯
User側でログイン等の機能を有しているが、各々のDBにデータがあるためAdmin側で一括管理ができない状態だった、改善としてUserのログイン機能の際はDB2を参照したい。
課題
ORMによってautomappingされている関係上、Entityが切り替わらずDB2のテーブルから取得ができないことが発生した。
結論
コントローラーからDQLを使用せずに直接SQLを使用したDBの複数利用しました。
これにより、EntityやRepositoryを使用しないので一時的なクエリが可能、Symfonyの良さを殺している気がするが仕方ないので続行!
コード一覧
コードのコピペで使える箇所があるが基本解説を見つつ各々設定をお願いします。
.envDATABASE_URL=mysql://t-shiroishi:password@localhost:3306/DB1
DATABASE_URL2=mysql://username:password@localhost:3306/DB2
doctrine:
dbal:
default_connection: default
connections:
default:
url: '%env(resolve:DATABASE_URL)%'
driver: pdo_mysql
server_version: 'mariadb-10.4.7'
customer:
url: '%env(resolve:DATABASE_URL2)%'
driver: pdo_mysql
server_version: 'mariadb-10.4.7'
# url: '%env(resolve:DATABASE_URL)%'
# IMPORTANT: You MUST configure your server version,
# either here or in the DATABASE_URL env var (see .env file)
#server_version: '13'
orm:
# default_entity_manager: default
auto_generate_proxy_classes: '%kernel.debug%'
entity_managers:
default:
connection: default
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: App
customer:
connection: customer
mappings:
customer:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/customer'
prefix: 'App\Entity\customer'
alias: customer
任意のContllore.php
use Doctrine\Persistence\ManagerRegistry;
$params = $this->getDoctrine()->getConnection('customer');
$result = $params->fetchAllAssociative( 'SELECT * FROM `Product`' );
dd($result);
解説
.envファイルに接続を行うDBの情報を記載
DATABASE_URL2=mysql://t-shiroishi:password@localhost:3306/customer
固定名称(自分の任意)=DB種別://user:pass@ip:port/DBname
doctrine.yaml DBの情報を命名しconnectionに使用する
dbal:DBの接続情報を記載
orm:doctrinのmapping情報※直接SQLを実行するため今回は未使用
php SQLの実行、実行に必要な「ManagerRegistry」の宣言
fetchAllAssociativeを使用するために宣言
use Doctrine\Persistence\ManagerRegistry;
DBのconnectionを構築、今回はcustomerと命名しているので呼び出し
$params = $this->getDoctrine()->getConnection('customer');
SQLを記載し実行
$result = $params->fetchAllAssociative( 'SELECT * FROM Product' );
結果表示
dd($result);
おわりに
結論に至るまでフランス語やら中国語の記事を読み漁りましたが惜しいところに手が届かず(自分の理解力が無い)
3.4日かかって上記コーディングができました。
本記事を読まれてみて、「ここがだめだな~」や「ここについて詳しく」など指摘、要望ありましたらお手柔らかにコメントしていただければ幸いです。