今回はこれからLaravelを使用する人に向けて、DB(データベース)の接続方法を一から解説していきます。
コードはなるべくコピペできるように、全て掲載するようにします。
今回はローカル環境でMySQLを使用したいと思います。
それでは始めましょう!
開発環境
- MacBook Pro (macOS Catalina バージョン10.15.2)
- PHP 7.3.9
- Laravel Framework 6.13.1
- MySQL バージョン8.0.19
Composer、Homebrewはすでにインストールしているとします。
DB接続の前準備
すでにプロジェクトを作成している場合は省略して次に進んでください。
新規プロジェクト作成
まずは新規プロジェクトを作成します。
ターミナル
composer create-project --prefer-dist laravel/laravel SampleApp
プロジェクトのカレントディレクトリに移動して、ローカル開発サーバを立ち上げます。
ターミナル
php artisan serve
.envのAPP_URLにポート番号を追加しておいてください。
APP_URL=http://localhost:8000
http://127.0.0.1:8000
にアクセスします。
ページが正常に表示されていればOKです。
MySQLをインストール
まずはMySQLをインストールします。
今回はmacOS用パッケージマネージャーであるHomebrewを使用してインストールします。
すでにインストールが完了している人は次に進んでください。
ターミナルで以下のコマンドを入力してMySQLをインストールしてください。
brew install mysql
インストールが完了したらMySQLを起動します。
mysql.server start --skip-grant-tables
※ --skip-grant-tables
をつけることでパスワードなしでログインが可能になります。
起動が完了したらルートユーザーで接続します。
mysql -uroot
ログインに成功すると以下のような表示になります。
Access denied for user 'root'@'localhost' (using password: NO)でログインできない場合
mysql -uroot
を入力すると以下のエラーが出る場合があります。
この場合は一旦MySQLを停止して、再度起動します。
ターミナルで以下のコマンドを入力します。
brew services stop mysql
mysql.server start --skip-grant-tables
mysql -uroot
DBを作成する
ログインまで完了したら、Laravelで使用するDBを作成していきます。
まずは現在存在するDBを確認してみます。
以下のコマンドを実行します。
mysql
show databases;
ローカル環境に存在するDBの一覧が表示されました(ここで表示されるDBは個人の環境で異なります)。
確認できたところでDBを作成します。
以下のコマンドでDBを作成します。
create database SampleApp;
※SampleAppの部分は任意のDB名を入れてください
show databases;
でDB一覧に先ほど作成したDB名があればOKです。
そのままrootユーザーのパスワードを変更します。
MySQLに接続した状態で以下のコマンドを入力します。
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'secret';
※rootユーザーのパスワードを「secret」に変更しています。
その後、MySQLの接続を終了してからMySQLを再起動します。
MySQL
exit
ターミナル
mysql.server restart
MySQLの認証プラグインを変更する
MySQL8.0以降デフォルトの認証プラグインは mysql_native_password から caching_sha2_password に変更されました。
しかしPHPの方ではまだサポートされていないため、認証プラグインを以前の mysql_native_password に戻します。
まずはMySQLに接続します。
ターミナル
mysql -uroot -p
パスワードを求めらるので「secret」と入力してエンター。
※文字を打っても表示されませんが気にせず入力してください。
MySQLに接続できたら、以下のコマンドで既存ユーザーの認証プラグインを確認してみます。
MySQL
SELECT user, host, plugin FROM mysql.user;
現在の認証プラグインが caching_sha2_password になっていることがわかります。
これを mysql_native_password に変更します。
以下のコマンドを入力します。
MySQL
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'secret';
rootユーザーの認証プラグインを変更したので確認します。
mysql_native_password に変更されました。
Laravelの.envファイルを修正する
次にLaravelの.envファイルを修正します。
.envファイルの中にDBの設定を記載することで、正常に接続することが可能になります。
DB_DATABASEの値を先ほど作成したDB名に、DB_PASSWORDを先ほど設定した「secret」に変更します。
.env
APP_NAME=Laravel APP_ENV=local APP_KEY=base64:/w6PLiX4uYRs4h/ZtQxXpUh28DCjiKyKhX1E+k036iM= APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 # DB_DATABASE=laravel DB_DATABASE=SampleApp DB_USERNAME=root DB_PASSWORD=secret BROADCAST_DRIVER=log CACHE_DRIVER=file QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=null MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
.envファイルを修正した後は、キャッシュをクリアします。
ターミナル
php artisan config:cache
DB接続が完了!マイグレーションを実行してみる
これでDBとLaravelの設定が完了しました!
マイグレーションを実行してみて、DBにテーブルが作成されるか確認してみます。
ターミナル
php artisan migrate
マイグレーションが完了したのでDBを確認します。
まずはMySQLに接続します。
ターミナル
mysql -uroot -p
パスワードを求めらるので「secret」と入力してエンター。
※文字を打っても表示されませんが気にせず入力してください。
MySQLに接続できたら、以下のコマンドを入力します。
DB一覧を表示
show databases;
使用するDBを選択
use SampleApp;
テーブル一覧を表示する
show tables;
マイグレーションによってテーブルが作成されていることが確認できました!
【補足】作業中にエラーが発生した場合
基本的には手順通り進めていけば、エラーなくLaravelとDBの接続は完了すると思いますが、DBの設定中につまづきがちなエラーとその解消方をご紹介します。
php artisan migrateでSQLSTATE[HY000] [2002] Connection refusedが出る場合
これはDBに接続できていないエラーです。
以下の項目を確認してください。
・.envファイルのDB_DATABASE、DB_USERNAME、DB_PASSWORDにMySQLのDBと同じものが設定されているか。
・.envファイルを修正した後にキャッシュをクリアしたか。
・rootユーザーのパスワードを変更した際にMySQLを再起動したか。
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client が出る場合
これはPHPがMySQL8.0の認証プラグインに対応できていないことが原因です。
MySQLの認証プラグインを変更する の手順にしたがって、MySQLの認証プラグインを「caching_sha2_password」から「mysql_native_password」に変更してください。
今回はローカル環境で、LaravelとDBを接続する方法を説明しました。
今回の記事で分かりにくいところや、他にも解説して欲しい内容があれば、是非ともコメント欄やお問い合わせからメッセージをください!
これから「Laravelを勉強したい!」と考えている人は一冊書籍を持っておくと体系的に勉強できます。
Laravelを使用したアプリ開発を学ぶのであれば「青本」がおすすめです。
私もこの書籍から入りました!
「Webサービスを作りたい!」という方に向けて記事を書きました。
業務未経験からポートフォリオなしでWebエンジニアに転職した際の経験談を語りました。
30代未経験からエンジニアに転職する際のプログラミングスクールについて書きました。
コメント