Laravel データベース接続編

やること

  • データベースを作成する。
  • ユーザーを作成して権限を与える。
  • .envファイルを修正する。
  • php artisan migrateの実行。

データベースを作成して、ユーザーに権限を与える

MySQLをインストールして、データベースを作成する。

mysql -u root //MySQLに接続  
create database 'db_name'; //DB作成   
show databases; //DBが作成されたか確認   



次に、ユーザーを作成しデータベースに対する権限を与える。

//ユーザー作成。
create user 'user_name'@'%' identified by 'password'; 
// %はワイルドカードで、どんなホスト名がここに入ってもOKということになる。

//ユーザーに権限を付与。
GRANT ALL ON <db_name>.* TO 'user_name'@'%'; 

//どんな権限がどこに付与されているのか確認。
show grants for 'user'@'%'; 

//設定を確実に反映させる。
flush privileges 


MySQL8.0 認証方式を変更する

私はまずここでハマりました。
このままデータベースの設定を終えて、進めて最後にマイグレーションを実行すると

$ php artisan migrate
   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2054] The server requested authentication ・・・


というエラーが発生してしまいます。

MySQLはそれぞれのアカウントが「どうやって認証されるべきか」をアカウント情報の中に持っている(5.6とそれ以降) mysql.user テーブルには plugin というカラムがあり、 MySQL8.0では、 mysql_native_password ではなく、caching_sha2_password がデフォルトの認証プラグインとなりました。

SELECT user, host, plugin FROM mysql.user; //既存ユーザーの認証方式を確認。

+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| vagrant          | 127.0.0.1 | caching_sha2_password |
| vagrant          | 192.168.% | caching_sha2_password |
| mysql.infoschema | localhost | mysql_native_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| root             | localhost | caching_sha2_password |
| vagrant          | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+



この場合、root@localhost は caching_sha2_password で認証される、という設定になっています。
MySQLの認証はチャレンジ・レスポンス認証なので、クライアント(今回はLaravel)とサーバー(MySQL)で同じ認証形式をサポートしている必要があります。

Laravel5.6のDB接続機能ではこの方式に対応していないので、ユーザーの認証方式を変更する必要があります。

alter user 'username' identified with mysql_native_password by 'password';

これで完了!


.envファイルの設定変更

データベースの設定を終えた段階でマイグレーションを実行すると、以下のようなエラーが出てきます。

Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access denied for user ・・・



次に.envの中身を作成したデータベースに応じて書き換えなければいけません。
.env は開発環境やステージング環境、本番環境などで、環境毎に変更したい情報をまとめておくファイルのこと。
Composer経由でLaravelのプロジェクトを作成すると.envファイルが作成されます。
それでは、.envファイルにデータベースの設定をします。

[.env]

DB_CONNECTION=mysql
DB_HOST=127.0.0.1  //localhostに変更
DB_PORT=3306
DB_DATABASE=homestead  //変更
DB_USERNAME=homestead  //変更
DB_PASSWORD=secret  //変更


変更するのはこの箇所。

さらに、
念のため.env.exampleとconfig/database.phpも作成したDBに応じて変更します。 ただ、マイグレーションを実行した時に先に読まれるのは、database.phpではなく、.envだそうです。


[config/database.php]

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', 'localhost'), #変更
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'tutorial'), #変更
            'username' => env('DB_USERNAME', 'root'), #変更
            'password' => env('DB_PASSWORD', ''), #変更
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],


.envの変更を反映させる

.envを変更した後に、こちらを実行すると反映されます。

php artisan config:cache



こちら を参考にさせていただきました。
以上で、データベース接続に関するだいたいのエラーは解消されそう!


残る疑問...

実は、一つ解消できなかった問題があります。
今回作成したユーザーに権限を与えて、そのユーザーを使ってデータベース接続をしたかったのですが、何度やってもエラー。。

ユーザー作成

権限付与

flushで設定を反映

.env書き換え

.env変更を反映

php artisan migrateの実行

同じ手順を踏んでいるのに、

Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access denied for user ・・・


こちらのエラーが出続けるんです。
ユーザーをrootに切り替えたらすんなり実行できました。

しばらく戦いましたが出口が見えてこないので、
この課題は持ち帰ります。。