MAMPでLaravelとデータベースを接続する

# データベースへ接続とは
Laravelがデータベース（以下DB)に接続すると
DBに蓄積されたデータをWEB画面に
表示させることができるため
ブログや通販サイトのように
個別の情報を表示できるようになります


## DBにLaravelを接続するには

DBにLaravelを接続するには次の情報が必要です

- 接続先のホスト
- 接続先のポート番号
- データベース名
- ユーザー名 / パスワード
- ソケット（必須ではありません）

上述の情報で次のファイルを修正します

- .envファイル
参照元：[Laravelインストール先]
- database.php
参照元：[Laravelインストール先]/config/database.php

## 接続情報について

### 接続先のホストとは
データベースが稼働しているサーバーのサーバー名です
サーバーの`IPアドレス`を入力することもできます。

お名前.comなどのレンタルサーバーではサーバー名を
公表されていないケースもあり、その場合
コマンドでIPアドレスを確認するか
IPに紐づいたホスト名を確認するコマンドを実行します

ローカルホストの場合は、ホスト名は
`localhost`に固定されています。
IPアドレスも`127.0.0.1`に固定されています

![スクリーンショット 2023-04-05 9.41.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/05d724bf-34ea-6501-94cb-0dc217f768a8.png)


### 接続先のポート番号とは
通信をする際の機器の接続口もしくは窓口を指します

銀行や役所で受付する窓口が複数あるように
PCにUSBポートやLANポートなど複数の差込口があるように

DBのデータを受付する窓口も専用のポートが存在するため
Laravel側ではどこにデータを送信するのか
ポート番号つまり送信先を設定する必要があります

ポート番号はMAMPの場合初期が`8889`ですが
MAMPの設定画面で簡単に変更することができます
※後述のブラウザからも確認が取れます

![スクリーンショット 2023-04-05 9.20.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/3230ea56-1e8f-b5dc-9d5e-daf4fc4f0ef6.png)


### データベース名とは

テーブルやレコードなどを格納した
データベースの実名です

MAMPがスタートされている場合は
phpMyAdminが使用できるためデータベース名は
ブラウザ画面で確認できます

http://localhost:8888/phpMyAdmin5/

![スクリーンショット 2023-04-04 16.21.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/ed14718d-3428-4c7b-0298-4e00e7d7480c.png)


### DBのユーザー名とパスワード

DBは操作するユーザーごとに操作権限を設定することができ
ユーザーに与えられたユーザー名やパスワードによって
テーブルの閲覧のみや内容の変更までなど詳細な権限を
設定をすることができます

データベースの接続に必要な`ユーザー名`と`パスワード`は
MAMPのMySQLの場合
初期ではどちらも`root`になります

### ソケットとは

電球やシガーライターの差込口をソケットと呼びますが
それと同等で`通信の接続口`を指します

![25480477_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/6decc271-8dc6-67ea-02bf-651c6664638e.jpeg)


MySQLでサーバーのDBと通信をする場合
通信の接続口は2種類存在します
- ソケット接続（ローカル通信）
- TCP接続（インターネット通信）



単純にソケット接続の方が通信速度が理論上速いと
されておりソケット接続を用意しなければ
TCP接続になります。よって必ず設定しなくてはいけない
項目ではありません

ソケット接続に切替えるためには`mysql.sock`という
ファイルが必要であり、MAMPにはmyslq.sockが
配置されているためファイルのパスをLaravelに
設定すればソケット接続を使用できます

具体的に`database.php`でパスを指定します

Laravelのバージョンによっては
`.envファイル`に設定する場合もありますので
適宜対応お願いします


## MAMPでの接続情報確認

接続に関する情報はMAMPの場合
WEBサイトから確認できます

![スクリーンショット 2023-04-03 15.58.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/944889b1-1e0d-1358-84a4-ead20e6b1e39.png)

![スクリーンショット 2023-04-04 11.27.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/7811e919-44ae-a67e-668e-25691cddfa52.png)

## LaravelとDBを接続する

LaravelとDBを接続させるには
フレームワーク内に存在する設定ファイルの
DB接続情報を上書きする必要があります

### DB接続の設定ファイルは隠しファイル

DBを接続するための情報を入力するファイルは
`隠しファイル`のため見えません。

次の操作により隠しファイルを
選択できるように操作します

Macの場合
`「command」＋「shift」＋「.」`

### DB接続情報を.envファイルに上書きする

Laravelのプロジェクトを開き
隠しファイルの`.evnファイル`を開いて
環境変数の値を変更します

環境変数とはOSが参照する値を指し
この場合、Laravelが参照する大元の
設定値になります

![スクリーンショット 2023-04-05 10.16.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/720f6136-e85e-1a1c-794e-f70bb185213b.png)


MAMPのhtdocsフォルダに作成した
Laravelのプロジェクトを開きます

※開く場合にどのアプリで開くか
求められる場合はテキストエディットなどの
アプリを選択します

![スクリーンショット 2023-04-05 10.21.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/d7d3a0c5-cfd2-b74c-d228-91ebd03479a4.png)

### DB接続情報を上書きする

開いた.envファイルから上述の
情報を上書きします

- 接続先のホスト
- 接続先のポート番号
- データベース名
- ユーザー名 / パスワード

![スクリーンショット 2023-04-05 10.48.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/2540e8ec-7651-7757-683a-b55533772d10.png)


#### DB_CONNECTION
デフォルトで`mysql`になっているため
mysql以外を使用している場合は変更が必要です

#### DB_HOST
ホスト名`localhost`
IPアドレス`127.0.0.1`
どちらを入力しても問題ありません

#### DB_PORT
MAMPの場合初期の値は`8889`です。
必要であれば適切な値に変更してください

#### DB_DATABASE
phpMyAdminの画面などで
データベース名をすでに作成している場合は
そのデータベース名を入力します

#### DB_USERNAME と　DB_PASSWORD
MAMPの場合初期値が
`root`/`root`なので
入力したら上書きします

#### その他
DBの接続情報は赤枠で囲まれた
`DB_****`のみであるため
APP_***やMAIL_***などを編集しても
DBの接続に影響はありません


## DB情報をdatabase.phpに上書きする

.envファイルの上書きが済んだなら
database.phpにも情報を上書きします

参照元：[Laravelインストール先]/config/database.php

今回使用するデータベース管理システムは
`MySQL`なので赤枠で示した`mysql`を編集します

```php:database.php
'mysql' => [

            ~~~~~~省略~~~~
            'host' => 'DB_DATABASE','ホスト名',
            'port' =>  'DB_HOST','ポート番号',
            'database' => env('DB_DATABASE', 'データベース名'),
            'username' => env('DB_USERNAME', 'ユーザー名'),
            'password' => env('DB_PASSWORD', 'パスワード'),
            'unix_socket' => env('DB_SOCKET', '/Applications/MAMP/tmp/mysql/mysql.sock'),
            ~~~~~~省略~~~~

```

![スクリーンショット 2023-04-08 14.38.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/b88235f8-1f65-a8a8-cb9a-5b431f3dd306.png)




## DBに接続されているか確認する

`.env`ファイルに接続情報を入力し上書きすれば
DBと連携する準備は整います。

接続されているかどうかの確認は
以下のコマンドで簡単に確認ができます

### php artisan tinker

Laravel環境に標準搭載された対話型シェルです

シェルとはユーザーとOSを繋ぐプログラムの一種で
ユーザーが出した命令をOSに伝える窓口のような
役割を持っています

```実行するコマンド手順.
① カレントディレクトリをLaravelのプロジェクトに設定します

$ cd /Applications/MAMP/htdocs/gakusyuu_sample 

② tinkerコマンドを実行してLaravelの対話型シェルを起動します

$ php artisan tinker 


```

### DB::connection()->getPdo();


tinker（ティンカー）を使用するとコマンドで
プロジェクト内に存在するプログラムを
動作させることができます

レコードを登録、編集、出力する他
Laravelに記述した設定や関数などの
動作確認をコマンドだけで実行することができます

今回はtinkerを使用しDBが
正常に接続できているかを
確認します

```
次のコマンドを実行します
$ DB::connection()->getPdo();


-----以下解説------

・DBファザードとはDBに関する関数、プログラム群を指します
・connectionメソッドでデータベースに接続を行います
・getPdoで接続されたDBのサーバー情報を取得します

```

### 正しく接続されていない場合

`DB::connection()->getPdo();`
失敗した場合は接続が拒否されます

tinkerコマンドは`exit`で終了することが
できるため、一度終了した後に接続に必要な
設定値を見直してもう一度実行してください


![スクリーンショット 2023-04-05 15.58.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/1bb1a055-8541-0244-7a06-b4a9fecf471f.png)


### 正しく接続された場合

`DB::connection()->getPdo();`
接続が成功した場合は接続先の
サーバー情報が出力されます

サーバー情報を出力されることが
目的なので、表示される値などは
確認に関係はありません

確認が終了次第、`exit`で
tinkerを終了してください
![スクリーンショット 2023-04-05 16.18.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/58d76a95-ac95-cfe7-0269-694a9ea5f207.png)

### ソケット情報（パス）を入力しなかった場合

通信方法がTCP/IPになるだけで
特に通信に支障はありません

Unixソケットファイルで作成された接続は
MySQLとデータベースが同じコンピューター上の
サーバーに接続する場合にのみ使用できます

TCP/IPはインターネットを利用して通信する方法であり
Unixソケットは同じマシン上で効率的に通信を
行うことができます

![スクリーンショット 2023-04-08 15.01.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/8065306a-7b6e-8b92-1019-ce9b7b452e82.png)



### 接続情報を確認するコマンド

.envファイルで設定したDBの
接続情報は次のコマンドで確認ができます


```実行するコマンド.
※ php artisan tinker を起動した状態でコマンドを実行

> DB::connection()->getConfig();

```

### 接続が失敗した場合

次の参考画像ではわざとポート番号を
空欄に設定して接続確認を実行しています

設定値を修正してやり直す場合は
php artisan tinkerを`exit`で
終了して再度実行する必要があります


![スクリーンショット 2023-04-05 16.25.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/bb81d1be-79d8-225d-0a48-675e8d5ce3dd.png)