【MAMP】laravelのMySQL接続エラー([1045] Access denied for user)

初学者です。
「laravelで開発してみよう！」と思った初学者が一番初めにぶち当たりそうなエラーの解決方法を紹介します。

# 開発環境
PHP 7.3.9
MAMP 5.7
Mysql 5.7.26
Laravel 6.20.7
Composer 2.0.8

# エラー内容

MAMPのhtdocsでComposerを使い、laravelをインストールします。
その後、phpMyAdminでDBを新しく作成し、DBにアクセスするユーザーを作成。
作成したlaravelアプリとDBを接続するために、ターミナルで、

```ターミナル
$ php artisan migrate
```

を実行すると

```ターミナル
 Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access denied for user 'error_test_user'@'localhost' (using password: YES) (SQL: select * from information_schema.tables where table_schema = error_test and table_name = migrations and table_type = 'BASE TABLE')

  at /Applications/MAMP/htdocs/error_test/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673| 
```

というエラーが表示される場合があります。

# 原因
```
SQLSTATE[HY000] [1045] Access denied for user 'error_test_user'@'localhost'
```

を訳してみると、__「ユーザー（error_test_user'@'localhost）のアクセスが拒否されました」__と書いていますね。
考えられることを検証していきましょう。

# 解決策
##.envファイルの確認(MySQLのHOSTとPORT)
.envでは環境変数を設定していると思います。

```php:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=[接続するDBの名前]
DB_USERNAME=[アクセスするuserの名前]
DB_PASSWORD=[アクセスするuserのパスワード]
```

まず初めに確認していただきたいのが__DB_HOST__及び__DB_PORT__の値です。
この値はMAMPでサーバーを起動した時に出てくるこのページ↓のMySQL欄に記載してあるものと同じものを記入しているか確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474463/d92c3330-3658-d903-4933-10adde40a83c.png)

![mysql_host_port_check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474463/91321082-61cb-6303-d9f2-3a46229c441b.png)
この場合、.envはこうですね。

```php:.env
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=8889
DB_DATABASE=[接続するDBの名前]
DB_USERNAME=[アクセスするuserの名前]
DB_PASSWORD=[アクセスするuserのパスワード]
```

## アクセスするユーザーのHost nameを確認する
phpMyAdminで作成したユーザーの情報を確認しましょう。
![phpmyadmin_user_check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474463/33d4711e-d05f-04f4-90ca-b925da69bfd5.png)
ユーザーを追加する際、ここのデフォルト値が「%」になっているので、「localhost」に変更する必要でがあります。
写真では「%」になっているのでユーザーを編集するか削除して新しく作り直す必要がありますね。

## キャッシュのクリア
上記の2つが正しいことを確認できているのであれば、

```
$ php artisan migrate 
```

を実行すれば問題なくDB接続が完了するはずです。
しかし、これでも結構同じエラーがまだ表示されるという方もいるらしいので、一応キャッシュのクリアをしておきましょう。
laravelは内部のキャッシュが残ってしまい、更新が反映しないことが多いです。
 
```
$ php artisan config:cache
```
.envやconfig下のファイルを編集した場合はこれをターミナルで実行してください。

```
$ php artisan cache:clear
```

また、一応ですがこのコマンドでアプリケーション自体のキャッシュをクリアしておくこともお勧めします。

キャッシュをクリアした後にもう一度、

```
$ php artisan migrate 
```

をすればうまくいくはずです。

## それでもうまくいかない場合(unix_socket)
私は上記の設定を確認するだけで接続できたので以下は参考までに。
今回はlocalhostを接続先ホストに指定しているのでUNIX_ドメインソケットを使用したDB接続であるはずなので、.envにDB_SOCKETを設定します。

``` php:.env
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=8889
DB_DATABASE=error_test
DB_USERNAME=error_test_user
DB_PASSWORD=laravel0123
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
```
DB_SOCKETの値はMAMPのwebページに書いていあります。
![mysql_host_port_check2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474463/efbbbf21-be81-0b18-4a17-d0a6259c7e9d.png)

もしくは、
config/database.phpで直接記入してもいいかもしれません。

``` php:database.php
        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
```

ソケットの設定が必要だとする記事があるので開発環境やバージョンによっては必要な設定だと考えられます。

# 最後に
上記の解決法で直らない場合は、開発環境の違いやスペルミスなどが考えられるので見直してみるのをお勧めします。