データベースの接続設定を行った後は、接続確認をしてみましょう。 LaravelにはArtisanというコマンドが実行できるプログラムが同梱されているので、Windowsであればコマンドプロンプト・macOSであればターミナルを利用して接続確認を行っていきます。

Laravelのデータベース接続確認

3ヶ月以内に更新されました。
更新日 : 2020年02月04日

データベースの接続設定を行った後は、接続確認をしてみましょう。

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ボタンを押してコマンドプロンプトを起動します。詳しくはこちらをお読みください。

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メソッドの中にある処理を変更しています。

これは、testテーブルを作成し、カラムの設定として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ファサードクラスから上記のようにメソッドを実行するとインサート処理ができます。メソッド名が直感的に理解できるかと思います。

  1. tableメソッドで引数にテーブル名を入れてテーブルを指定
  2. insertメソッドでテーブルに挿入するデータを連想配列で設定
    連想配列のキー名をデータベースのカラム名とし、連想配列の値にはデータベースに登録したいデータを指定

データベースに登録が完了すると=> trueと表示されます。

登録されたレコードを取得してみましょう。

>>> DB::table('posts')->get();

これでtestテーブルに存在するレコードをすべて取得できます。

実行すると以下のように出力されます。

>>> 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からデータベースに接続してデータのインサートやセレクトができることが確認できました。

基本としてはこれで十分かと思います。