Laravelを使ってアプリケーションを構築する際にデータベースが必要になりますが、今回はシンプルですぐに使えるsqliteデータベースを使ってテーブルの作成と確認を行います。

MAC環境で動作確認を行っており、デフォルトでsqliteがインストールされているためすぐに使用することができます。

laravel5.7とlaravel5.8で動作確認を行っています。

sqliteデータベースの作成

touchコマンドを使用して、Laravelインストールディレクトリの下にあるdatabaseディレクトリの中にdatabase.sqliteを作成します。


$ touch database/database.sqlite

ファイル名は、configディレクトリの中のデータベース関連の設定ファイルdatabase.phpファイルのsqliteの設定箇所にdatabase.sqliteが指定されているため、作成するファイル名にdatabase.sqliteを使用しています。


'connections' => [

    'sqlite' => [
        'driver' => 'sqlite',
        'database' => env('DB_DATABASE', database_path('database.sqlite')),
        'prefix' => '',
        'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
    ],

.envファイルの編集

初期設定ではデータベースはmysqlへの接続が前提になっているので、Laravelインストールディレクトリにある環境変数設定ファイル”.env”を編集します。

【編集前】


DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

【編集後】

DB_CONNECTIONの値をmysqlからsqliteに更新して、DB_HOSTからDB_PASSWORDの行は削除します。


DB_CONNECTION=sqlite
DB_DATABASEを削除しないとIlluminate\Database\QueryException : Database (homestead) does not exist.のエラーが発生します。

php artisan migrateでテーブルの作成

sqliteデータベースの作成、sqliteに関するLaravelの設定が完了したので、テーブルの作成を行います。Laravelインストール直後でもphp arisan migrateコマンドを使用するとusersテーブルとpassword_resetsテーブルがデータベースに作成されます。


laravel $ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table

php artisan migrate実行後、上記のようにMigration table create successfully(成功)が表示されればsqliteに2つのテーブルが作成されています。

テーブル作成までの手順等に誤りがある場合は、php artisanを実行すると下記のエラーが発生します。


laravel $ php artisan migrate
   Illuminate\Database\QueryException  : Database (homestead) does not exist. (SQL: PRAGMA foreign_keys = ON;)

sqliteのコマンドによるデータベースの確認

せっかくなので、sqliteのコマンドを使用して、本当にテーブルが作成できているのかを確認してみましょう。作成したdatabase.sqliteのあるdatabaseディレクトリに移動して、sqlite3コマンドでファイルを指定します。接続するとsqliteのバージョンも確認することができます。


database $ sqlite3 database.sqlite 
SQLite version 3.13.0 2016-05-18 10:57:30
Enter ".help" for usage hints.
sqlite> 

.tablesコマンドを実行するとデータベース内に作成されたテーブルを確認することができます。3つのテーブルが作成されています。migrationsテーブルはmigrationファイルの実行履歴を管理するテーブルです。


sqlite> .tables
migrations       password_resets  users  

users, password_resetsはテーブルが作成されているだけで中身が空です。migrationsにはusersとpassword_resetsの履歴が残されているはずなので、確認してみましょう。そのまま実行しても列名が表示されないので、”.headers on”でヘッダーを表示させます。実行するとusers, password_resetsのmigrationの情報を確認することができます。


sqlite> .headers on
sqlite> select * from migrations;
id|migration|batch
1|2014_10_12_000000_create_users_table|1
2|2014_10_12_100000_create_password_resets_table|1

sqliteを終了する際は、.quitで終了することができます。

テーブルへデータを追加してみよう

sqliteでのデータベース、テーブルの作成方法を確認しました。LaravelにはSeederという機能で一括でダミーデータを登録することができますが、今回はtinkerを使って手動で行ってみましょう。

tinkerはLaravelアプリケーションにコマンドラインでアクセスすることできるツールで、tinker上でテーブルへの追加を行うことができます。

tinkerを使ってユーザ登録

tinkerはphp artisan tinkerで起動します。


$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.1.23 — cli) by Justin Hileman

下記の手順でユーザを作成することができます。passwordの部分だけbcrypt関数を使用しているのはpasswordの文字列を暗号化するためです。


>>> use App\User;
>>> $user = new User();
=> App\User {#3188}
>>> $user->name = 'John';
=> "John"
>>> $user->email='johndoe@example.com';
=> "johndoe@example.com"
>>> $user->password = bcrypt('password')
=> "$2y$10$wAtFiqYSuVQJn6yzI5HeQ.5mtR5vTm29sL6Oi9yokdMBT7cSm7DIm"
>>> $user->save();
=> true
>>> quit

ユーザの作成が完了したら、sqlite3コマンドを使ってデータベースに接続してをusersテーブルに登録が完了しているのか確認してみましょう。


vue $ sqlite3 database/database.sqlite
SQLite version 3.13.0 2016-05-18 10:57:30
Enter ".help" for usage hints.
sqlite> .headers on
sqlite> select * from users;
id|name|email|email_verified_at|password|remember_token|created_at|updated_at
1|John|johndoe@example.com||$2y$10$iqv4L8o5.faROymizYwwwux0IoHUC/iQcxbocFEiLwUmn.DTzfyfm||2019-06-06 07:29:35|2019-06-06 07:29:35

tinkerを使用することでユーザが作成できることが確認できました。tinkerでもテーブルに登録されているユーザ一覧を取得することができます。


vue $ php artisan tinker
Psy Shell v0.9.9 (PHP 7.1.23 — cli) by Justin Hileman
>>> use App\User;
>>> $users = User::all();
=> Illuminate\Database\Eloquent\Collection {#3194
     all: [
       App\User {#3195
         id: "1",
         name: "John",
         email: "johndoe@example.com",
         email_verified_at: null,
         created_at: "2019-06-06 07:29:35",
         updated_at: "2019-06-06 07:29:35",
       },
     ],
   }

sqlite3を使ってsqliteデータベースに接続してテーブルの中身を確認することができましたが、tinkerでは上記のようにApp¥Userモデルを経由してデータベースへ接続を行うので、どのデータベースソフト(mysqlでもsqliteでも)のソフトウェアで作成されているか関係なく同じ方法でデータベースへ接続することができます。Laravelも同様で構築が完了しアプリの作成になると何かの問題で直接データベースにアクセスすることがない限りどのデータベースソフトで作成されているか意識することはありません。

テーブルにアクセスした場合に[PDOException] SQLSTATE[HY000] [2002] Connection refusedエラーが発生した場合は、php arisan serveを一度停止し、再度実行してみてください。

開発を続けるには、ここから先はsqliteの使用方法ではなくLaravelの使用方法を理解していく必要があります。