Day3. データベースの作成と利用

画面の作成がひとまずできたところで、次はデータベースのセットアップを行ってみましょう。

本章の目標

  • データベースを作成してフォームからデータを入力出来るようにする。
  • データベースからデータを抽出し、画面に表示できるようにする。
  • Laravel におけるテーブルの作成・管理の手法をマスターする。
  • Laravel におけるテーブルの CRUD 処理の手法をマスターする。

Database への接続

Homestead を利用した構成の場合、通常は Database の接続設定等を操作する必要はありません。

本番環境や Homestead 以外の構成でDatabase に接続する場合、 プロジェクトルートにある、 .env を利用して、以下の項目を操作して 接続情報を管理します。

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

また データベースを利用したアプリケーション構築を行う際には、 データベースのクライアントツールなどを利用して、データベースの中身を確認出来るようにしておきましょう。

Homestead を利用している場合、以下の情報で 接続出来るようになっています。

  • host 127.0.0.1
  • port 33060
  • user homestead
  • pass secret

Laravel を使ったテーブル作成

Laravel には標準でデータベースのセットアップツールが付属しており、 通常はこれを用いてデータベースへのテーブル作成等を行う場面が多いでしょう。

Laravelのテーブル作成ツールからテーブルを作成する場合、 プロジェクトのルートで以下のコマンドを実行します。

$ php artisan migrate

コマンドを入力したら、実際にデータベースの中身を確認してみましょう。

デフォルトで用意されれている、 user というテーブル定義が データベースに反映されたのが分かるかと思います。

この様にmigrate は、 Laravel 内で作成されたテーブル定義を、 DB内に反映してテーブルの管理を行う事ができるコマンドです。

テーブルの定義は、database/migrations フォルダの中に記述されており、 デフォルトでここにユーザテーブルとパスワードテーブルの記述が入ってるのが確認できるでしょう。

今回は TODO リストを作成するため、TODOを管理するためのテーブルを作成してみます。

以下のコマンドを実行すると databases/migrations フォルダに新しくマイグレーション用のファイルが作成されます。

$ php artisan make:migration todo

作成されたファイルを開き、以下のようにテーブル記述を追記してください。

public function up(){
    //テーブル作成
    Schema::create('tasks', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->boolean('is_finished')->default(false);
        $table->timestamps();
    });
}

public function down(){
    //テーブル削除
    Schema::dropIfExists('tasks');
}

up は DB作成時に実行するテーブル作成のコマンド、 down はテーブル削除時に実行するテーブル削除のコマンドです。

今回は、tasksというテーブル名で、 id name と日付項目を持つテーブルを作成してみました。

では実際にこのマイグレーションファイルを使用して、DBにテーブルの作成を行ってみましょう。

再度以下のコマンドを実行してみてください。

$ php artisan migrate

migrateコマンドは、追加されたファイルを検出し自動的にテーブルの追加作成を実行してくれます。

間違えた場合やマイグレーションを実行し直したい場合など、 マイグレーションをやり直すには、以下のコマンドを実施します。

$ php artisan migrate:fresh

migrate:fresh は全てのテーブルを削除し、イチからマイグレーションを再実行します。 データが全て消える事になりますので、開発中の環境でのみ実施するようにしましょう。

フォームからデータを追加する

テーブルの準備ができたところで、実際にデータを追加してみましょう。

データベースの情報が出力できたら、今度はフォームからデータベースに追加できるようにしてみましょう。

前回、以下の様なフォームのルートを作成していました。

Route::post("/task",function(){
    $taskName = request()->get("task_name");
    // ここでDBなりに保存する。
    return redirect("/tasklist");
});

このコメントの部分に、データベースにデータを追加するための処理を追加していきます。

データベースにデータを追加する際には SQL と呼ばれる言語で 問い合わせを行います。 SQLの INSERT 文を利用して以下のようなコードを 記述してみましょう。

Route::post("/task",function(){
    $taskName = request()->get("task_name");
    DB::insert("insert into tasks (name) values (?)",[$taskName]);
    return redirect("/tasklist");
});

問題なくフォームが動作していれば、 フォーム上から入力したデータが次々にデータベースに追加されるはずです。

データベースからデータを取得する

データベースに格納したデータを取得して、画面に反映してみましょう。

データベースからデータを取得するには SELECT 文と呼ばれる SQL を使用します。

tasklist の画面を表示する以下のルートで、次のようにしてデータベースのデータを取得します。

Route::get("/tasklist",function(){
    $tasks = DB::select("select * from tasks");
    return view("tasklist", [ 
        "message" => "hello world",
        "tasks" => $tasks
    ]);
});

これで $tasks の変数に データベース内のタスク一覧が出力されます。 テンプレート内で利用可能なように、"tasks" => $tasks として、 view 関数に値を渡すのを忘れないようにしましょう。

tasklist.blade.php の側では以下のようなコードを記述してタスクデータを画面出力します。

<ul>
@foreach($tasks as $task)
    <li> {{$task->name}}</li>    
@endforeach
</ul>

foreach 内それぞれで取得できる $task には、 データベースの行のデータがそのまま入ってくる形となっており、 $task->name のように列名を指定することで、列の情報のみを出力出来るようになっています。

データベースの利用

以上のようにして DB クラスから データベースに SQL と呼ばれる問い合わせ言語を発行して、 データベースを操作できる、ということがわかりました。

例えば、データを取得したい場合、以下のようにして SELECT 文を発行します。

$tasks = DB::select("select * from tasks");

検索条件の追加には where 句を利用します。

$tasks = DB::select("select * from tasks where id = 1");

パラメータは ? を利用してプリペアドステートメントとして渡すほうがセキュリティ上安全です。

$id = 1;
$tasks = DB::select("select * from tasks where id = ?",[$id]);

データの格納には INSERT 文を使用します。

DB::insert("insert into tasks (name) values (?)",[$taskName]);

データの更新には where 句を添えて UPDATE 文を使用します。

DB::update("update tasks set name=? where id = ?",[$taskName,$id]);

データの削除には where 句を添えて DELETE 文を使用します。

DB::delete("delete from tasks where id = $id",[$id]);

様々なSQLを覚えることで、多様なデータベース操作が可能になります。 まずは一通り基本のCRUD 操作をマスターして、データベースの操作に親しんでみましょう。

try!

  • /task/1 /task/2 のように、ID を利用して個別のタスク詳細画面を表示できるようにしてみましょう。
  • 削除ボタンを用意して、データの削除が行えるように工夫してみましょう。
  • テーブル上に用意したis_finished 列に 未完了なら0 完了なら1 と言った風に値を代入し、タスクの完了が登録できるように工夫してみましょう。
  • 完了したタスクの一覧、未完了のタスク一覧の表示が切り替えられるように調整してみましょう。

参考

Laravel マイグレーション

https://laravel.com/docs/5.7/migrations

Laravel データベースの接続

https://laravel.com/docs/5.7/database