複数のLaravelアプリを任意のデータベースに接続する方法

##はじめに
Laravelでの開発で、最初のサンプルアプリはつくってみた。
次は本格的にアプリケーションを作ってみたいけど
最初に使ったDBとは別のDBに接続してテーブル作りたい。
そんな時に試行錯誤した設定方法を備忘録として残します。
誰かの参考になれば幸いです。

＊１〜３の手順は初めてLaravelを使用する際にも通る工程です。

開発環境
MAC
VirtualBox
Homestead
vagrant 2.2.9
PHP 7.3.11
Laravel 5.5.48

##1.Laravelのダウンロード
composerで新規のLaravelをインストールしていきます。
ターミナルを開いてHomesteadが置いてあるディレクトリまで移動します。
移動したら以下を打ち込んでください。
`composer create-project laravel/laravel Laravel_new`
`Laravel_new`の部分はファイル名にあたります。任意のプロジェクトファイル名に変更してください。
ディレクトリ構造は
Laravel
　|- Homestead
　|- Laravel_sample
　|- Laravel_new
となります。

##2.Homestead.yamlを編集する
```yaml
~~省略
folders:
//↓最初に設定したパス
    - map: /Users/ユーザー名/Laravel 
      to: /home/vagrant/code

//↓追加するパス　同じディレクトリなので設定する必要ないかもしれませんが一応いれておきます
    - map: /Users/ユーザー名/Laravel
      to: /home/vagrant/code

sites:
//↓最初に設定したパス
    - map: laravel.sample
      to: /home/vagrant/code/laravel_sample/public

//↓追加するパス
    - map: laravel.new　//ドメイン名になる。基本なんでもOKだけど全部小文字で！
      to: /home/vagrant/code/laravel_new/public



databases:
    - homestead
    //↓使用したいデータベース名を設定します。これも何でもOK。２つ目のLaravelアプリで使用するテーブルがこのデータベースに入ります。
    - laraveldb
~~省略
```
##2.hostsファイルにドメインを追加
hostsファイルは自身のPCに最初から入っているファイルです。
「hosts」で検索するとectというフォルダの中に入ってると思います。
先ほどのHomestead.yamlに追加したドメイン名と同じものを、このhostsファイルにも追記します。
必ず半角スペースをあけて追記しましょう。

```
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1	localhost
255.255.255.255	broadcasthost
::1             localhost
192.168.10.10 laravel.sample laravel.new ←これ
```

注意点として、このhostsファイルはPC上の大事なファイルなので変更できないようになっています。
一度、デスクトップなどに移動させてから変更し、終わったら元の場所に戻すというやり方で変更できます。

##3.envファイルの設定
.envファイルに、今回のlaravel.newで使用するMySQLのデータベースにアクセスできるよう、設定を追加します。

```
~省略~
↓もともとあったもの
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=***

↓laravel.newのために追加するもの
DB_CONNECTION_NEW=laravelnew
DB_HOST_NEW=127.0.0.1
DB_PORT_NEW=3306
DB_DATABASE_NEW=laraveldb
DB_USERNAME_NEW=root
DB_PASSWORD_NEW=***

~省略~
```

末尾に追加した`_NEW`は区別するために加えたものです。
`DB_DATABASE_NEW`は`Homestead.yaml`の `databases: `で設定した名前の通り指定します。
usernameとpasswordは自身のものを指定してください。今回は＊で伏せています。

##4.database.phpの設定
Laravelのセットに入っているdatabase.phpに設定を追記します。
configフォルダに入っています。

```php
 'laravelnew' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST_NEW', '127.0.0.1'),
            'port' => env('DB_PORT_NEW', '3306'),
            'database' => env('DB_DATABASE_NEW', 'laraveldb'),
            'username' => env('DB_USERNAME_NEW', 'root'),
            'password' => env('DB_PASSWORD_NEW', '***'),
            'unix_socket' => env('DB_SOCKET_NEW', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
```

変更箇所のみ抜粋しています。
追記が終わったら、一番上のdefaultも変更しておきましょう。
`laravelnew`とは、前工程で編集したenvファイルの`DB_CONNECTION_NEW`に設定したものです。

```php
'default' => env('DB_CONNECTION_NEW', 'laravelnew'),
```
DB_CONNECTION名は、「この設定で指定した通りのものを使います！」という合言葉のようなもの（と認識しております。）です。違ったらご指摘いただけると幸いです…。
例えば、この先シーディングファイルにテーブルの初期値を入れることになるかと思いますが、その時に
`DB::connection('laravelnew')->table('users')->insert([...])`とすると、database.phpに追記したデータベースに入れてくれます。
（defaultに設定しておけばこの手順は省けるはずなんですが、なぜか私の場合は使いたいデータベースに接続できず、最初に使用していたデータベースにシーディングされてしまいました…）

##5.設定の反映
ここまでできたら、今までの設定を反映させます。
database.phpなどの設定ファイルをいじった後は仮想OSを再起動しないと反映されません！
`vagrant reload --provision`をターミナルに打ち込んでください。

##6.最終確認
これで設定は完了したはずですが、このまますぐにmaigrateしたりseedするのはちょっと怖いので
本当に設定できているか確認しましょう。
tinkerを使います。
`vagrant ssh`でssh接続します。
`cd`で自身のプロジェクトファイルまで潜って（今回はlaravel_new）
`php artisan tinker`と叩きます。
以下は実行した処理内容です。

```
vagrant@homestead:~/code/laravel_new $ php artisan tinker
Psy Shell v0.9.12 (PHP 7.4.5 — cli) by Justin Hileman
>>> config('database.default')
=> "laravelnew"
>>> config('database.connections.laravelnew')
=> [
     "driver" => "mysql",
     "host" => "127.0.0.1",
     "port" => "3306",
     "database" => "laraveldb",
     "username" => "root",
     "password" => "***",
     "unix_socket" => "",
     "charset" => "utf8mb4",
     "collation" => "utf8mb4_unicode_ci",
     "prefix" => "",
     "strict" => true,
     "engine" => null,
   ]
>>> 
```

`config('database.default')`でdatabase.phpでデフォルトに設定したコネクション名がでてきます。
次に、`config('database.connections.laravelnew')`で、database.phpに設定した内容が走ります。

これで先ほど設定した内容がうまいこといってることが確認できました！
安心してマイグレーション、シーディングができますね。

ちなみに実際にマイグレーションするときに
`php artisan migrate --database=laravelnew`
とすると確実にlaravelnewで使用したいデータベースに接続できるはずです。心配な方はやってみるといいと思います！

***

以上で任意のデータベースに接続する方法は終了です。
次回はできあがったアプリをHerokuにデプロイするまでの工程を記事にしたいと思います！

この記事の内容に、間違っている点、もっとこうした方がいいという点などありましたらコメントいただけると幸いです。