Laravelでポートフォリオ作り vol.6【DB登録処理編】

前回に引き続き、ポートフォリオ作りを進めていきます。
今回は登録処理の実装をしていきます。
前回、サーバーに入力内容を送信し、送信値を確認する部分まで実装できました。
今回は、DBにテーブルの用意をしてデータの登録をしていきます。

前回の記事

DBへのテーブルの作成

Laravelではテーブルを作成するためにMigrationファイルの作成&実行を行います。
このMigrationファイルですが、Modelクラス作成のコマンドを使用することで作成することが可能です。
もちろんMigrationファイルとModelクラスを別々に作成しても良いのですが、コマンドを用いて同時に作成することで、Laravelの命名ルールに沿ったものを作成できます。

コマンドはこちら
※Studentの部分は適宜書き換えましょう

php artisan make:model Student --migration

コマンドを実行すると、StudentというModelクラスが作成されるとともに、「students」テーブル作成用のMigrationファイルが作成されます。

作成されたMigrationはこんな感じ

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('students', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('students');
    }
};

upメソッドがテーブル作成のメソッドになるので、ここにテーブル定義を記述していきます。
※一部省略しています

public function up()
{
    Schema::create('students', function (Blueprint $table) {
        $table->id();
        $table->string('student_sei')->comment('生徒 姓');
        $table->string('student_mei')->comment('生徒 名');
        $table->date('student_from_date')->comment('入校日');
        $table->date('student_to_date')->nullable()->comment('退校日');
        $table->text('student_memo')->nullable()->comment('生徒メモ');
        $table->timestamps();
    });
}

Migrationファイルを作成したら、migrateコマンドでDB操作を行います。

php artisan migrate

エラーが出なければ問題なく実行されています。

データの登録処理

続いてControllerの登録処理を実装していきます。
LaravelではDB操作をModelクラスを通して実行します。登録処理についてはModelクラスのsaveメソッドを使用します。

StudentController.phpのstoreメソッドを修正します。
また、Studentモデルを使用するため、useによりStudentモデルを読み込みます。

<?php

namespace App\Http\Controllers;

use App\Models\Student;
use Illuminate\Http\Request;

class StudentController extends Controller
{
    /**
     * 一覧画面
     */
    public function index()
    {
        省略
    }

    /**
     * 登録画面
     */
    public function create()
    {
        省略
    }

    /**
     * 登録処理
     */
    public function store(Request $req){
        // Studentモデルのインスタンスを作成
        $student = new Student();
        
        // リクエストの値を設定
        $student->student_sei = $req->input('student_sei');
        $student->student_mei = $req->input('student_mei');
        $student->student_from_date = $req->input('student_from_date');
        $student->student_to_date = $req->input('student_to_date');
        $student->student_memo = $req->input('student_memo');
        
        // 保存
        $student->save();
    }
}

保存処理の流れとしては

  1. モデルクラスのインスタンスを作成
  2. インスタンスに値を設定
  3. saveメソッドを実行して、DBに値の反映を行う

となります。値の設定については「fill」という便利なメソッドがありますが、ここでは基礎的な記述の学習のために使用していません。興味のある方は調べてみてください。

それでは、画面の登録フォームに生徒情報を入力して登録してみましょう。

登録ボタン押下後、エラー画面にならず「真っ白」な画面に遷移すると思います。
これは登録処理をしただけで、その後の処理を定義していないためです。

ひとまず、この時点でDBの登録内容を確認してみましょう。送信した入力内容がDBに登録されていることが確認できます。

登録後の処理

登録後に真っ白になってしまっては、システムの挙動として不自然ですね。
登録後、一覧画面に遷移するようにしてみましょう。

保存処理の後に一覧画面へのリダイレクトを追加します。
このリダイレクトとは自動的に別のページに遷移させる挙動を指します。クライアントからは「登録処理」のURLにリクエストが飛んできていますが、これを一覧画面へのリクエストに切り替えて一覧画面を返却します。

<?php

namespace App\Http\Controllers;

use App\Models\Student;
use Illuminate\Http\Request;

class StudentController extends Controller
{
    /**
     * 一覧画面
     */
    public function index()
    {
        省略
    }

    /**
     * 登録画面
     */
    public function create()
    {
        省略
    }

    /**
     * 登録処理
     */
    public function store(Request $req){
        // Studentモデルのインスタンスを作成
        $student = new Student();

        // リクエストの値を設定
        $student->student_sei = $req->input('student_sei');
        $student->student_mei = $req->input('student_mei');
        $student->student_from_date = $req->input('student_from_date');
        $student->student_to_date = $req->input('student_to_date');
        $student->student_memo = $req->input('student_memo');

        // 保存
        $student->save();
        
        return redirect(route('student.index'));
    }
}

この記述により、登録処理後に一覧画面にリダイレクトされるようになります。

もう一度登録してみて、登録後に一覧画面に遷移すればOK。

今回はここまで。
登録処理については、必須項目が未入力の場合にエラー表示をするといったような、入力チェックの実装を行う場合もあります。
今回も生徒氏名などは必須項目とすべきではありますが省略しています。
まずは一通り動くものを作成してから、そういった細かい部分の実装をしていこうと思いますので、後の記事をお待ちください。