Laravel 入門 #2 – Database の利用

Laravel を利用して 簡単な TODO リストの作成を行います。第二回目は 基本的な ルートの設定と画面の作成について紹介していきます。

データベースのセットアップ

前回は、Laravel での ルートの設定と画面の作成方法を紹介しました。

Laravel 入門 #1 – Router と View の作成

画面の作成方法がわかったら、次にデータベースのセットアップを行ってフォームのデータをデータベースに保存してみましょう。

Laravel にはデータベースセットアップのための migrationという仕組みが用意されており、テーブルの作成なども Laravel のコマンドから実行する事が出来ます。

データベースの接続

データベースの接続情報は .env ファイル内に記述します。

.env ファイルの中の 以下の記述箇所を、自身のDB接続環境 に合わせて編集してください。

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

Laravel Homestead を利用する場合 既にセットアップ済みの データベース MySQLが用意されており、.env の記述もそのままで利用を始める事が出来ます。

テーブルを作成する

データベースを作成するには php artisan migrate コマンドを実行します。

仮想環境を利用している場合、vagrant sshで仮想環境にログインしてから実行してください。

$ php artisan migrate

migrate は DB内にテーブルを作成するためのコマンドです。

database/migrations フォルダの中に記述されているテーブル定義ファイルに沿って、テーブルを作成する事が出来ます。Laravel ではデフォルトでここにユーザテーブルとパスワードテーブルの記述が入っており、先程実行した php artisan migrate のコマンドでこれらのテーブルが作成されたことを確認できるはずです。

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

以下のコマンドを実行すると datagases/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 は全てのテーブルを削除し、イチからマイグレーションを再実行します。データが全て消える事になりますので、開発中の環境でのみ実施するようにしましょう。

データベースへの書き込み

テーブルが作成されたので、実際にデータベース経由でデータを投入してみましょう。

DBの操作

フォームのボタンがクリックされたタイミングで DBにデータを追加する処理を記述してみましょう。

前回作成したのフォーム送信先のルート /task の処理を以下のように変更します。

Route::post("/task",function(){
    \DB::table("tasks")->insert([
        "name" => "本を買いに行く"
    ]);
    return redirect("/");
});

\DB::table("tasks")->insert([ ... ]) はデータベースのテーブル tasks にデータを投入するための書き方です。

insertの引数に 任意のデータセットを渡して、それぞれの列にデータを投入することが出来ます。上記の例では name 列に 本を買いに行く というデータをわたしています。

実際にフォームのボタンを押し、Database にデータが投入されるのを確認してみましょう。

フォームデータの受け取り

データベースへデータが保存されることを確認したら、次は実際にフォームで入力したデータを登録できるようにしてみましょう。

今、フォームには、task_nameという名前の、テキストフィールドが存在します。

    <input type="text" name="task_name" value="">

このフィールドの値を取得する場合、ルート側で request()-&gt;get("task_name") のように記述します。

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

これでフォームに入力されたテキストが データベースの中に保存されることを確認できるはずです。

データベースからの読み込み

次にデータベースに投入したデータを、画面に表示する機能を実装していきましょう。

データベースからのデータの読み込みを行うには アドレス / のルートを以下のように変更します。

Route::get("/",function(){
    $tasks = \DB::table("tasks")->get();
    return view("index",[
        "tasks" => $tasks
    ]);
});

\DB::table("tasks")->get()tasks テーブルからデータを取り出すための記述です。
取り出したデータは $tasks 変数に格納しています。

ルート内で取得したデータをテンプレート(HTML)側で利用可能にするためには、
view 関数の第二引数に変数を渡す必要があります。

上記コードのように $tasks 変数を tasks という名前で渡すことで、テンプレート側で $tasks 変数が使用可能になります。

resources/views/index.phpに以下の様なコードを追加してみましょう。

<table>
<?php foreach($tasks as $index => $task): ?>
<tr>
    <td><?= $index+1 ?></td>
    <td><?= $task->name ?></td>
</tr>
<?php endforeach; ?>
</table>

\DB::table("tasks")-&gt;get() で取得出来る結果は、複数件のリスト形式になっており、
foreach などを使って順次値を確認する事が出来ます。上記例では、取得した結果を使用してテーブルを作成しています。

$task-&gt;nameの様に列名をプロパティ名としてアクセスすることで
データの中身にアクセスすることが出来るようになっています。

様々なデータベース操作

データベースの操作には、他にも様々な手法が存在しています。

指定した条件でデータベースを削除するには、以下のような記述を追加します。

\DB::table("tasks")->where("id",$id)->delete();

whereで削除する行の条件を指定し、deleteを呼び出すと削除を実行可能です。

また、データの取得時にデータのフィルタリングを実施する際にも whereが利用可能です。

\DB::table("tasks")->where("id", 2)->get();

上記のコード例では、getでの取得に条件を追加し、 ID が2番の行のみ取得するよう指定しています。

また updateを用いて、データの更新を行うことも可能です。

\DB::table("tasks")->where("id", 2)->update([
    "name" => "掃除をする"
]);

上記のコード例では、ID が2番の行の name 列を 「掃除をする」 に変更しています。

Try!

以上の内容を踏まえて以下のような機能を実装してみましょう!

  • タスクリストの各項目の横に 「削除」 ボタンをつけ、ボタンを押すと削除できるようにする
  • タスクリストの各項目の横に 「完了」ボタンをつけ、ボタンを押すと is_finished 列が true になるようにする
  • 一覧に表示する項目を is_finished 列が false のもののみに限定し、また完了したタスクを表示できる画面を用意する。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です