Symfony4 複数DBの使用方法①

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

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [対象者](#対象者)
1. [環境](#環境)
1. [経緯](#経緯)
1. [結論](#結論)
1. [コード一覧](#コード一覧)
1. [解説](#解説)
1. [おわりに](#おわりに)

<a id="#対象者"></a>
## 対象者
この記事は下記のような人を対象にしています。

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

<a id="#環境"></a>
## 環境
- PHP7
- symfony4

<a id="#経緯"></a>
## 経緯
User側でログイン等の機能を有しているが、各々のDBにデータがあるためAdmin側で一括管理ができない状態だった、改善としてUserのログイン機能の際はDB2を参照したい。
![Untitled5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602338/7bcc7919-5fbe-7c0f-e2b2-81953bdd3a40.png)

<a id="#課題"></a>
## 課題
ORMによってautomappingされている関係上、Entityが切り替わらずDB2のテーブルから取得ができないことが発生した。
<a id="#結論"></a>
## 結論
コントローラーからDQLを使用せずに直接SQLを使用したDBの複数利用しました。
これにより、EntityやRepositoryを使用しないので一時的なクエリが可能、Symfonyの良さを殺している気がするが仕方ないので続行！

<a id="#コード一覧"></a>
## コード一覧
コードのコピペで使える箇所があるが基本解説を見つつ各々設定をお願いします。
<h2 id="3f04861a-35c3-4150-92a8-f807eb2c1330" class="" id="#"></h2>
<body>
.env
<pre id="735e90fe-cbef-4f1d-9f06-23af41023505" class="code"><code>DATABASE_URL=mysql://t-shiroishi:password@localhost:3306/DB1
DATABASE_URL2=mysql://username:password@localhost:3306/DB2</code></pre>
doctrine.yaml
<pre id="ad27ba21-d5e2-4063-8820-f876deea7d6f" class="code"><code>doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                url: &#x27;%env(resolve:DATABASE_URL)%&#x27;
                driver: pdo_mysql
                server_version: &#x27;mariadb-10.4.7&#x27;

            customer:
                url: &#x27;%env(resolve:DATABASE_URL2)%&#x27;
                driver: pdo_mysql
                server_version: &#x27;mariadb-10.4.7&#x27;
        # url: &#x27;%env(resolve:DATABASE_URL)%&#x27;

        # IMPORTANT: You MUST configure your server version,
        # either here or in the DATABASE_URL env var (see .env file)
        #server_version: &#x27;13&#x27;
    orm:
        # default_entity_manager: default
        auto_generate_proxy_classes: &#x27;%kernel.debug%&#x27;
        entity_managers:
            default:
                connection: default
                mappings:
                    App:
                        is_bundle: false
                        type: annotation
                        dir: &#x27;%kernel.project_dir%/src/Entity&#x27;
                        prefix: &#x27;App\Entity&#x27;
                        alias: App
            customer:
                connection: customer
                mappings:
                    customer:
                        is_bundle: false
                        type: annotation
                        dir: &#x27;%kernel.project_dir%/src/Entity/customer&#x27;
                        prefix: &#x27;App\Entity\customer&#x27;
                        alias: customer

</code></pre>
任意のContllore.php
<pre id="8c52daa7-d298-4b03-a24a-f07a833ac1df" class="code"><code>use Doctrine\Persistence\ManagerRegistry;
$params = $this-&gt;getDoctrine()-&gt;getConnection(&#x27;customer&#x27;);
$result = $params-&gt;fetchAllAssociative( &#x27;SELECT * FROM `Product`&#x27; );
dd($result);</code></pre>

<p id="15efed95-0120-4f67-8443-1791e585a780" class=""></p>
<h2 id="3f04861a-35c3-4150-92a8-f807eb2c1330" class="" id="#解説">解説</h2>
<p id="98bcd772-7c61-4956-b745-b1769800522d" class="">.envファイルに接続を行うDBの情報を記載</p><pre id="f49e7b98-00c5-4f0b-ac20-86f6b2ba4fe6" class="code"><code>DATABASE_URL2=mysql://t-shiroishi:password@localhost:3306/customer
固定名称(自分の任意)＝DB種別://user:pass@ip:port/DBname</code></pre><p id="570367a1-15c3-4528-b29f-aa79b5dcca6e" class="">
</p><p id="9edb69d1-2f79-4506-be98-f4a8e2c10b5b" class="">doctrine.yaml　DBの情報を命名しconnectionに使用する</p><pre id="8837d543-c260-46d4-93f2-a8895cdcfc9c" class="code"><code>dbal:DBの接続情報を記載
orm:doctrinのmapping情報※直接SQLを実行するため今回は未使用</code></pre><p id="31e5bd77-941d-4b68-a4a5-a96ef93ee582" class="">
</p><p id="51d89552-a0a7-456d-9ae7-c6aa4c8467cb" class="">php　SQLの実行、実行に必要な「ManagerRegistry」の宣言</p><pre id="ebec650b-d6f3-487b-b2b6-d8e3ea723d37" class="code"><code>fetchAllAssociativeを使用するために宣言
use Doctrine\Persistence\ManagerRegistry;　

DBのconnectionを構築、今回はcustomerと命名しているので呼び出し
$params = $this-&gt;getDoctrine()-&gt;getConnection(&#x27;customer&#x27;);

SQLを記載し実行
$result = $params-&gt;fetchAllAssociative( &#x27;SELECT * FROM `Product`&#x27; );

結果表示
dd($result);</code></pre><p id="a53dde07-6f9b-4b0c-b29c-422f8dfa1fbc" class="">

<a id="#おわりに"></a>
## おわりに
結論に至るまでフランス語やら中国語の記事を読み漁りましたが惜しいところに手が届かず(自分の理解力が無い)
3.4日かかって上記コーディングができました。
本記事を読まれてみて、「ここがだめだな～」や「ここについて詳しく」など指摘、要望ありましたらお手柔らかにコメントしていただければ幸いです。


## 参考記事
- [直SQLに関して](https://www.notion.so/Symfony-DB-0ebae95c96ae426fb9457c105c544b23#23ee7f4e458348fc9c24610ae97dda2d)
- [doctrin　複数DBに関して](https://www.notion.so/Symfony-DB-0ebae95c96ae426fb9457c105c544b23#9be6a20a38d2429e8e0a25b6b931fe92)
- [Symfony　doctrin　DQL参考](https://www.notion.so/Symfony-DB-0ebae95c96ae426fb9457c105c544b23#027356920829468cb93782c791af2c13)
- [QueryBuilder::execute()  fetchAllAssociative()などのクエリに関してのドキュメント](https://www.notion.so/Symfony-DB-0ebae95c96ae426fb9457c105c544b23#1c5209af3ed545bda304b126525f053d)
- [symfony2 複数DBの接続方法](https://www.notion.so/Symfony-DB-0ebae95c96ae426fb9457c105c544b23#d8ed54a81fba4c7d9055f1b443aeb9b9)