#概要
本記事は、PHPフレームワークLaravel入門 第2版で学習している中の疑問・つまづきの備忘録です。
今回はLaravelからDBへの接続エラーの原因と解決策についてまとめます。
なお、PHPフレームワークLaravel入門 第2版ではSQLiteを利用していますが、MySQLに読み替えて同じことを行なっています。
#発生したエラー
peopleテーブルのレコードを全件検索しようとした際に、下記のエラーが発生しました。
#ソースコード
/////////一部抜粋
use Illuminate\Support\Facades\DB;
class HelloController extends Controller
{
public function index(Request $request)
{
$items = DB::select('select * from people'); ////ここでエラー発生
return view('hello.index', ['items' => $items,]);
}
原因
.envに設定していたDB_HOSTが誤っていました。
#.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1 #######ここが原因
DB_PORT=3306
DB_DATABASE=laravel_practice
DB_USERNAME=sail
DB_PASSWORD=password
#なぜDB_HOST=127.0.0.1ではだめだったのか
127.0.0.1は、自分自身を指す特別なIPアドレスです。ここではLaravelが動いているホスト自身を指します。
しかしMySQLが動いているのは別のホストであり、そちらを指定してやる必要がありました。
MySQLのホストを調べるには、docker psコマンドを使用します。
出力結果のNAMESを確認すると、別コンテナで動いていることがわかります。
$ docker ps
////出力結果は一部抜粋
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
286f413a566c sail-8.1/app "start-container" 8 days ago Up 8 days 0.0.0.0:80->80/tcp, 8000/tcp laravel-practice_laravel.test_1
77c6251fe186 mysql/mysql-server:8.0 "/entrypoint.sh mysq…" 8 days ago Up 8 days (healthy) 0.0.0.0:3306->3306/tcp, 33060-33061/tcp laravel-practice_mysql_1
#解決策
.envに設定していたDB_HOSTを修正します。
#.env
DB_CONNECTION=mysql
DB_HOST=laravel-practice_mysql_1 #######ここをMySQLが動くコンテナ名に修正
DB_PORT=3306
DB_DATABASE=laravel_practice
DB_USERNAME=sail
DB_PASSWORD=password
ちなみに、DB_HOST=mysqlに設定することでも接続可能です。
コンテナを起動したら、アプリケーションの.envファイル内のDB_HOST環境変数をmysqlに設定することで、アプリケーション内のMySQLインスタンスに接続できます。
Laravel 8.x Laravel Sail
#参考文献