Laravelのデータベース接続確認
更新日 : 2021年04月07日
データベースの接続設定を行った後は、接続確認をしてみましょう。
LaravelにはArtisanというコマンドが実行できるプログラムが同梱されているので、Windowsであればコマンドプロンプト・macOSであればターミナルを利用して接続確認を行っていきます。
事前準備
MySQLの準備
事前準備として、データベース接続設定まで行わなければいけません。データベースの作成とMySQLユーザーの作成を済ませておきましょう。MySQLユーザーに関しては、今回はLaravelでテーブルの作成まで行うことができるMySQLのユーザーを作成をしておきます。
データベース作成
MySQLのrootユーザーで以下のSQLを実行し、データベースを作成します。
CREATE DATABASE laravel_test DEFAULT CHARACTER SET utf8mb4;
これでデータベースを作成しておきましょう。データベース名はlaravel_test
としました。
ユーザー作成
次にMySQLのユーザー作成をしておきます。すでに作成されている場合は必要ありません。
CREATE USER 'test_user'@'%' IDENTIFIED BY 'password';
適宜ユーザー名やパスワードを変更して利用してください。今回は同じPC内からMySQLに接続するため、ホスト名には%
を設定します。ホスト名に%
を指定すると、すべてのホストを許可することになります。
今回はtest_user
というユーザー名でpassword
というパスワードを設定しました。
権限設定
次に作成したユーザーに権限を設定します。今回はテーブル作成の権限が必須となりますが、面倒なので作成したデータベースに対してすべての権限を付与してしまいます。すべての権限を付与するには以下のSQLを実行してください。
GRANT ALL ON laravel_test.* TO 'test_user'@'%';
これでtest_user
ユーザーにはlaravel`_test
データベースのすべての権限(*
がすべてのテーブルの意味)が付与されます。すべての権限を付与するALL
を付けましょう。
これでMySQLの準備は完了です。
データベース接続設定
次にLaravelにデータベース接続設定を行います。データベースの接続設定 に従い、Laravelの.env
に設定を記述しましょう。
上記と同じ設定にするのであれば以下のように設定します。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_test
DB_USERNAME=test_user
DB_PASSWORD=password
DB_PORT
はMySQLサーバーを実行しているポート番号を指定します。起動しているMySQLサーバーが受け付けているポート番号を指定してください。
データベースの接続確認前の準備
本題である接続確認の前にもう一つ準備が必要です。接続確認には、Windowsであればコマンドプロンプト・macOSであればターミナルを利用します。
また、ターミナルやコマンドプロンプトでphp
コマンドを利用します。実行するPHPのバージョンは7.1.3
以降であればLaravelバージョン5.8
に対応しています。
Laravelのバージョンが6.x
の場合、PHPのバージョンは7.2.0
以上である必要があります。
WindowsでXAMPPを利用している方はXAMPPのコントロール画面からShellボタンを押してコマンドプロンプトを起動します。詳しくはこちらをお読みください。
![XAMPPのShellボタン](https://it.becrazy.jp/uploads/2019/6/xampp-control-shell-button.png)
macOSの利用者はPHPがデフォルトでPHPバージョン7がインストールされているため基本的には不要です。素直にターミナルアプリを起動しましょう。
PHPがターミナルやコマンドプロンプトで使えることを確認するため、以下のコマンドを実行しましょう。
$php -v
PHP 7.2.19 (cli) (built: Jun 17 2019 09:03:55) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.19, Copyright (c) 1999-2018, by Zend Technologies
このようにバージョン情報が出力され、PHPのバージョンが、Laravelが必要とするPHPの最低バージョン以上であれば問題ありません。
macOSの方でバージョンが古い方はPHPのバージョンアップ(macOS)から、バージョンアップを行いましょう。(2019年07月04日現在、バージョンが7.3
だと正しく動作しません。注意してください。)Windowsの方はXAMPPの最新版であればPHPのバージョン7.2
を満たすはずです。
データベースの接続確認
ようやく本題であるデータベースの接続確認をしてみましょう。
ターミナルまたはコマンドプロンプトを起動後、プロジェクトディレクトリまで移動します。
プロジェクトの移動はWindowsのXAMPPであれば、起動後に
$cd %HOMEDRIVE%%HOMEPATH\Desktop\htdocs\laravelのプロジェクト名
とすると移動できます。これはLaravelのプロジェクトをデスクトップのhtdocs
内にインストールした場合です。こちらの記事でインストールした場所を指定しています。
ターミナルの場合は
$cd プロジェクトまでのパス
とすることで同様にターミナル内でプロジェクトまで移動できます。
筆者であればデスクトップのhtdocs
フォルダにlaravel-test
というプロジェクトで作成しているため
$cd ~/Desktop/htdocs/laravel-test
とします。
移動すると、Laravelのコマンドが利用できます。まずは以下のコマンドを実行しましょう。
$php artisan make:migration create_posts_table
Created Migration: 2019_07_03_100718_create_posts_table
これでテスト用テーブルを作成するためのPHPコード(テーブルスキーマ)が自動で生成されます。Created Migration: 2019_07_03_100718_create_posts_table
と表示されているので、2019_07_03_100718_create_posts_table.php
が作成されます。
このPHPコードはdatabase/migrations
ディレクトリに格納されます。
ファイルを以下のように編集してみましょう。
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePostsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
// 文字コードと照合順序の設定
// emojiを含むmb4と大文字小文字も区別するbinで設定
$table->charset = 'utf8mb4';
$table->collation = 'utf8mb4_bin';
// 主キー
$table->increments('id');
// タイトル
$table->string('title', 200);
// 本文
$table->text('content');
// created_at・updated_at
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('posts');
}
}
up
メソッドの中にある処理を変更しています。
これは、postsテーブルを作成し、カラムの設定としてid
カラムをauto_increment
で作成・title
カラムをvarchar(200)
で作成・content
カラムをtext
型として作成する処理になっています。
また、database/migrations
ディレクトリにはデフォルトで2つのPHPファイルが存在していますがそのままにしておいて大丈夫です。
この時点ではテーブルの定義を決め、テーブル作成のためのコードを作成しただけなので、以下のコマンドで実際にテーブルを作成してみましょう。先程のプロジェクトディレクトリの配下で以下を実行します。
$php artisan migrate
Migrating: 2019_07_03_100718_create_posts_table
Migrated: 2019_07_03_100718_create_posts_table
これで先程のPHPファイルが実行され、テーブルが作成されます。
このとき、LaravelからMySQLに接続しに行くので、接続設定が間違えていると以下のように表示されてしまいます。
Illuminate\Database\QueryException : SQLSTATE[HY000] [1045] Access denied for user 'test_use'@'172.17.0.1' (using password: YES) (SQL: select * from information_schema.tables where table_schema = laravel_test and table_name = migrations and table_type = 'BASE TABLE')
at …/Desktop/htdocs/laravel-test/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
660| // If an exception occurs when attempting to run a query, we'll format the error
661| // message to include the bindings with SQL, which will make this exception a
662| // lot more helpful to the developer instead of just the database's errors.
663| catch (Exception $e) {
> 664| throw new QueryException(
665| $query, $this->prepareBindings($bindings), $e
666| );
667| }
668|
Exception trace:
1 PDOException::("SQLSTATE[HY000] [1045] Access denied for user 'test_use'@'172.17.0.1' (using password: YES)")
…/Desktop/htdocs/laravel-test/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
2 PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=laravel_test", "test_use", "password", [])
…/Desktop/htdocs/laravel-test/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
Please use the argument -v to see more details.
接続設定が問題なければエラーは表示されません。
基本的にデータベースへの接続が失敗するとAccess denied for user
が表示されます。これは設定した接続設定が間違えている証拠です。
また、MySQLの接続ポートが間違えている場合にはConnection refused
と表示されます。
この時点でLaravelからMySQLに接続してテーブルを作成しているため、接続確認としては問題ありません。ですがせっかくテーブルまで作成したので、レコードの追加などもやってみましょう。
レコード操作をコンソールからやってみる
コンソール(コマンドプロンプトやターミナル)からLaravelのPHPコードを実行してみましょう。以下のコマンドで、PHPコードをコンソールから実行する準備が整います。
$php artisan tinker
Psy Shell v0.9.9 (PHP 7.2.19 — cli) by Justin Hileman
>>>
このようにPHPコードが実行できる状態になります。
早速MySQLからデータを登録してみましょう。
>>> DB::table('posts')->insert(['title' => 'TestTitle!', 'content' => '本文テスト!!']);
=> true
Laravelで用意されているDBファサードというものを使っています。DBファサードクラスから上記のようにメソッドを実行するとインサート処理ができます。メソッド名が直感的に理解できるかと思います。
table
メソッドで引数にテーブル名を入れてテーブルを指定insert
メソッドでテーブルに挿入するデータを連想配列で設定
連想配列のキー名をデータベースのカラム名とし、連想配列の値にはデータベースに登録したいデータを指定
データベースに登録が完了すると=> true
と表示されます。
登録されたレコードを取得してみましょう。
>>> DB::table('posts')->get();
これでposts
テーブルに存在するレコードをすべて取得できます。
実行すると以下のように出力されます。
>>> DB::table('posts')->get();
=> Illuminate\Support\Collection {#2931
all: [
{#2936
+"id": 1,
+"title": "TestTitle!",
+"content": "本文テスト!!",
+"created_at": null,
+"updated_at": null,
},
],
}
登録したデータが表示されれば成功です。
さらにレコードのアップデートも行ってみます。
DB::table('posts')->where('id', 1)->update(['title' => 'Title Update!!']);
実行が完了すると以下のように出力されます。
>>> DB::table('posts')->where('id', 1)->update(['title' => 'Title Update!!']);
=> 1
最後にレコードの削除までやります。
DB::table('posts')->where('id', 1)->delete();
このPHPコードの実行後、先程のget
メソッドで確認するとデータが消えているのが確認できます。
これで一通りデータベースの操作をやりました。PHPのコードを実行するコンソールから抜けるには、exit
と打ち、Enterで終了できます。
まとめ
最後のデータベースの操作は接続確認から少し逸脱しましたが、Laravelからデータベースに接続してデータのインサートやセレクトができることが確認できました。
基本としてはこれで十分かと思います。