Laravel(6.x)でMySQL接続設定をする

NoSQLなどが利用されるようになり、RDB(OracleやMySQLなど)の
出番は以前に比べて減少したと思いますが
RDB,NoSQLのそれぞれにメリット・デメリットがあるので
プロダクトにあわせて柔軟な選択が必要とされます
(両方使うケースも多いです)

そこで今回はLaravelでMySQLの接続設定を紹介したいと思います

.envを確認

Laravelをインストールすると、作成したプロジェクトフォルダの
直下に .env ファイルが作成されています
そのファイルの中に、DBについての定義があるので確認してみましょう

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

デフォルトで上記のようにMySQLを利用する記載となっており
ローカル環境のMySQLの laravel というデータベース名に接続する
記載となっています

Databaseを作成する

ローカル環境のMySQLにプロジェクト用のデータベースを
用意しましょう

まずはコマンドでmysqlに接続します
※ローカル環境に直接mysqlをインストールしていることを想定しています
 Docker上に設置している場合はlocalhost=Docker上になるので
 localhostの箇所を適宜、ホストOSのIPアドレスに変更してください

mysql -u root -p -h127.0.0.1

データベースを作成します(今回は hello という名前で作ります)

create database hello;
mysql> create database hello;
Query OK, 1 row affected (0.10 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hello              | ← 作成されたデータベース
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.02 sec)

ユーザを作成する

他のデータベースなどを誤って操作するなどして障害が発生する可能性があるため、
通常はrootユーザーを使ってデータベースにアクセスすることはありません
プロジェクト専用のユーザを作成、権限を付与し
それを使ってアクセスすることになります

ここでMySQLのユーザの作成と権限付与についても実施してみたいと思います

create user 'hello_user'@'localhost' identified by 'user_password';

ユーザー名:hello_user
パスワード:user_password
ホスト名(このユーザを使ってアクセスしてくるところ):localhost
で作成しました
作成されているか確認します

mysql> select Host, User from mysql.user;
+-----------+---------------+
| Host      | User          |
+-----------+---------------+
| %         | root          |
| localhost | hello_user    | ←作成されたユーザ
| localhost | mysql.session |
| localhost | mysql.sys     |
| localhost | root          |
+-----------+---------------+
5 rows in set (0.00 sec)

次に権限を設定します
権限を細かく設定できますが、今回は先程のデータベースに対しての
all権限を付与したいと思います

grant all on hello.* to 'hello_user'@'localhost';

権限を確認します

mysql> show grants for 'hello_user'@'localhost';
+---------------------------------------------------------------+
| Grants for hello_user@localhost                               |
+---------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'hello_user'@'localhost'                |
| GRANT ALL PRIVILEGES ON `hello`.* TO 'hello_user'@'localhost' | ←設定した権限
+---------------------------------------------------------------+

問題なく設定されていることが確認できました
これでhello_userはlocalhostからアクセスするときに限って
helloデータベースに対して操作することができるようになりました

ちなみに GRANT USAGE ON *.* TO 'hello_user'@'localhost' の権限は
ユーザーを作成したときに付与されるものですが
権限が何もない ことを表していて、ユーザーを作成しただけでは何もできない
ことがわかります

Laravelの設定をする

.envを修正

作成したデータベース、ユーザーを設定ファイルに記述します

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=hello
DB_USERNAME=hello_user
DB_PASSWORD=user_password

config/database.phpを修正

.envがあれば設定されますが、ない場合はconfig/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', 'hello'),
            'username' => env('DB_USERNAME', 'hello_user'),
            'password' => env('DB_PASSWORD', 'user_password'),

まとめ

MySQLのデータベース設定から、Laravelの設定までを紹介しました
LaravelはインストールするとデフォルトでMySQLが利用されるように
なっているため接続までのハードルは非常に低いです

他にも、.envをみてみるとREDIS(キャッシュサーバ)、AWS(クラウド) などの接続設定も追加されており、世の中の状況にあわせた対応もされています
こういった事からも人気が出ているのかもしれません