0
0

More than 1 year has passed since last update.

Symfony4 複数DBの使用方法①

Posted at

はじめに

駆け出しエンジニア2年目のtakaと申します、symfonyの日本語ドキュメントが少なすぎて困ることが多かったので備忘録として記事にしました。
初めて書くので至らないところが多いですが同じような方の助けになれば幸いです。

目次

  1. 対象者
  2. 環境
  3. 経緯
  4. 結論
  5. コード一覧
  6. 解説
  7. おわりに

対象者

この記事は下記のような人を対象にしています。

  • 駆け出しエンジニア
  • プログラミング初学者
  • PHP技術者(symfony4)
  • DQLについて知見、使用したことがある

環境

  • PHP7
  • symfony4

経緯

User側でログイン等の機能を有しているが、各々のDBにデータがあるためAdmin側で一括管理ができない状態だった、改善としてUserのログイン機能の際はDB2を参照したい。
Untitled5.png

課題

ORMによってautomappingされている関係上、Entityが切り替わらずDB2のテーブルから取得ができないことが発生した。

結論

コントローラーからDQLを使用せずに直接SQLを使用したDBの複数利用しました。
これにより、EntityやRepositoryを使用しないので一時的なクエリが可能、Symfonyの良さを殺している気がするが仕方ないので続行!

コード一覧

コードのコピペで使える箇所があるが基本解説を見つつ各々設定をお願いします。

.env
DATABASE_URL=mysql://t-shiroishi:password@localhost:3306/DB1
DATABASE_URL2=mysql://username:password@localhost:3306/DB2
doctrine.yaml
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日かかって上記コーディングができました。
本記事を読まれてみて、「ここがだめだな~」や「ここについて詳しく」など指摘、要望ありましたらお手柔らかにコメントしていただければ幸いです。

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0