【Laravel】MAMP(MySQL)でデータベース接続をする方法!エラーも解決
この記事からわかること
- LaravelでMAMP(MySQL)に接続する方法
- データベース接続の方法
- データベース接続後の操作の種類
- エラー:SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known (SQL: select * from テーブル名)の解決法
- エラー:SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = データベース名 and table_name = migrations and table_type = 'BASE TABLE')の解決法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Laravelでは簡単にデータベース接続ができると思っていたのに、思った以上に苦戦したのでMAMP(MySQL)への接続方法をまとめておきたいと思います。
私と同じ環境の人やエラーに苦しんだ方の役に立つと嬉しいです。
LaravelでMAMP(MySQL)への接続するためにやること
関連記事:公式:データベース設定
まずはやらないといけないことを整理しておきます。
- MAMPでデータベースの作成
- テーブルの作成
- .envファイルの修正
- database.phpの修正
とりあえずやることはこれだけです。しかしなぜか色々とエラーも起きたので私が無事に接続できた方法を紹介していきます。
今回はデータベースの作成、テーブルの作成手順は割愛します。以下の設定として進めていきますので適宜入れ替えてください。
- データベース名:MyDB
- テーブル名 :table
.envファイルの修正
まず一番最初にやるのは隠しファイルである「.envファイル」の編集です。このファイルはLaravelの動作環境や設定を変更することのできるファイルです。普段は非表示になっているのでプロジェクト内を開き「Shiftキー+cmdキー+.キー」を同時押しして表示させます。
表示させたら「.envファイル」を開き、以下のように修正します。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=MyDB
DB_USERNAME=root
DB_PASSWORD=root
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
コードの意味
DB_CONNECTION=データベースの種類
DB_HOST= 127.0.0.1 or localhost
DB_PORT= 8889 or 3306 (前者はMAMP、後者はMySQL どちらでもOK)
DB_DATABASE= 接続したいデータベース名
DB_USERNAME= ユーザ名
DB_PASSWORD= パスワード
DB_SOCKET= ソケットのパス
ここではデータベースに接続するために必要な情報を環境変数(DB_HOSTなど)と呼ばれる変数に格納しています。この値を変更することで指定のデータベースに接続することができます。
ソケットとはMySQLとの通信(unixソケット)を処理してくれる機能のことです。ソケットのパスを記載することでunixソケットという接続方法が使用できるようになります。ここを設定しない場合はTCP接続になるようです。
ホスト名(DB_HOST)の部分はTCP接続を使う際はDB_HOSTを127.0.0.1、unixソケットを使用して接続する際はDB_HOSTをlocalhostとします。
unixソケットとはプロトコル(通信規約)ではなくファイルシステムを使って接続をする方法のこと。
TCP接続とは「Transmission Control Protocol」の略称で信頼性の高いプロトコル(通信規約)TCPを使って接続する方法のことです。
ポート番号やユーザーネーム、パスワード、ソケットはMAMPのトップページの「MySQL」項目から確認することができます。
database.phpの変更
続いてプロジェクト内の「config」>「database.php」の中身を変更していきます。このファイルはLaravel内のデータベースに特化した設定ファイルです。ここのでも環境変数の設定を変更することができます。
しかし「.envファイル」にある値が最優先されるので注意してください。ここでは一応同じ値に設定を変更しておきます。
変更するのは上の方に記述されているdefault
の部分と、今回はMySQLなのでmysql
の連想配列の中の設定部分です。その部分を先ほど記載した「.envファイル」のように変更すればOKです。
'default' => env('DB_CONNECTION', 'mysql'),
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '8889'),
'database' => env('DB_DATABASE', 'MyDB'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', 'root'),
'unix_socket' => env('DB_SOCKET', ''),
ここではenv()
を使用して環境変数に値を入れ込んでいます。第一引数に格納したい環境変数名を、第2引数に入れ込む値を記述します。「.envファイル」で既に値は入れていますが、念の為ここでも同じ値を同じ環境変数の中に入れておきます。
これで接続はできているはずなのでエラーが起きていないかチェックしてみます。
$ php artisan migrate
Migration table created successfully.
このように出れば無事接続は成功です。
Laravelではキャッシュが残ってしまう可能性もあるので.envファイルなど設定ファイルを更新した場合はターミナルからキャッシュをクリアするコマンドを入力することをおすすめします。
$ php artisan cache:clear
$ php artisan config:cache
エラーの解決法
私は一発で接続とはいかずに色々なエラーに悩まされましたので周知しておきます。
出てしまったのは以下の2つのエラーでした。
SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = データベース名 and table_name = migrations and table_type = 'BASE TABLE')
これはphp artisan migrate
を実行した時に起きたエラーで、調べてみると接続が拒否されてしまった時に起きるエラーでした。.envファイルの設定がおかしいために起きるエラーのようです。
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known (SQL: select * from tech_post)
こちらもデータベース接続設定が間違っているために起きているエラーでした。データベース名、ポート番号、ユーザ名、パスワードが違っている可能性があります。スペルミスがないか再度チェックしてみてください。
「.envファイル」さえ最低限注意して設定すればエラーは起きないと思います。
データベース接続後の操作の種類
Laravelではデータベース接続処理が済んだ後に実際に操作する方法が数種類用意されています。
データベース操作する機能
- DBクラス
- DBクラス(クエリビルダ)
- Eloquent(エロクアント)
「Eloquent(エロクアント)」以外は今回解説した接続処理さえ終わればすぐ使うことができます。
また「クエリビルダ」は「DBクラス」の中の機能の1つですが記述方法が異なるため別の種類と認識しておくと分かりやすいかもしれません。
それぞれのメリット
DBクラスのメリット
- SQL文をそのまま使える
DB::select('
SELECT * FROM users
')
DBクラス(クエリビルダ)のメリット
- phpらしい構文でデータベース操作ができる
DB::table('users')->get();
Eloquent(エロクアント)のメリット
- phpらしいクラスとしてデータベース操作ができる
Users::all();
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。