LaravelのEloquentを利用してレコード登録を行っていきます。 前回のLaravelのEloquentでレコード取得記事で利用したテーブル(posts)と、Postモデルを利用して登録処理を実装してみましょう。

LaravelのEloquentでレコード登録

3年以上前に更新されました。情報が古い可能性があります。
更新日 : 2020年02月05日

LaravelのEloquentを利用してレコード登録を行っていきます。

前回のLaravelのEloquentでレコード取得記事で利用したテーブル(posts)と、Postモデルを利用して登録処理を実装してみましょう。

事前準備

単純にレコード取得を行うだけでなく、クライアントから受け取ったリクエストデータを利用してレコードを登録していきましょう。リクエストデータの取得についてはこちらの記事を読んでください。

記事追加フォームの作成

フォーム用のページをLaravelのbladeを利用して構築していきます。web.phpに以下を追記しましょう。

Route::prefix('post')->group(function () {
    // フォーム表示用
    Route::get('add', 'PostController@addForm');
});

Route::prefix('post')URLをグループ化するために利用します。

上記の設定の場合、Laravelのドキュメントルートから続けて/post/addというURLにアクセスが来たときに、PostControlleraddFormメソッドを実行 します。

次にルーティングで指定したPostControllerを作成します。

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Post;

class PostController extends Controller {

    /**
     * フォーム表示
     */
    public function addForm(){
        return view('post.addForm');
    }
}

addFormメソッドには、blade関連のファイルを配置するresources/views/ディレクトリにある、post/addForm.blade.phpを返すように設定しました。

/post/addForm.blade.phpを作成していきましょう。

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>Laravelでレコード登録</title>

    <!-- Fonts -->
    <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet">

    <!-- Styles -->
    <style>
        html, body {
            background-color: #fff;
            color: #636b6f;
            font-family: 'Nunito', sans-serif;
            font-weight: 200;
            height: 100vh;
            margin: 0;
        }

        .flex-center {
            align-items: center;
            margin: 100px 300px 100px 300px;
            justify-content: center;
        }

        .position-ref {
            position: relative;
        }
    </style>
</head>
<body>
    <div class="flex-center position-ref">
        <h1>ブログ記事追加フォーム</h1>
        @if ($errors->any())
        <div class="alert alert-danger">
            <ul>
                @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
        @endif
        <form method="POST">
            @csrf
            <dl>
                <dt>タイトル</dt>
                <dd><input type="text" name="title" required value="{{ old('title') }}"></dd>
            </dl>
            <dl>
                <dt>本文</dt>
                <dd><textarea name="content" required>{{ old('content') }}</textarea></dd>
            </dl>
            <input type="submit" value="投稿">
        </form>
    </div>
</body>
</html>

これでフォームの準備は整いました。リクエストデータの取得についてはこちらを参考にしてください。

POSTデータを受け取り、受け取ったデータをレコードに登録

フォームの準備が整ったので、実際にフォームを受け取り、レコード追加を行っていきます。

ルーティングの設定

まずはルーティングの設定です。web.phpに追記していきます。

Route::prefix('post')->group(function () {
    // フォーム表示用
    Route::get('add', 'PostController@addForm');
    // POSTデータを受け取る用
    Route::post('add', 'PostController@add');
});

Route::post('add', 'PostController@add');を追記しました。URLの構成がフォームの表示と同様に/post/addとなっていますが、Route::postメソッドを利用しているため、HTTPのGETリクエストPOSTリクエストは区別されます。

コントローラーの編集

このPOSTデータ受け取り用のURLはPostControlleraddメソッドで処理を行うように設定したので、PostControlleraddメソッドを作成していきましょう。

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Post;

class PostController extends Controller {

    /**
    * フォーム表示
    */
    public function addForm(){
        return view('post.addForm');
    }

    /**
     * Post登録処理
     * @param Request $request Postリクエスト
     */
    public function add(Request $request) {
        //バリデーション
        $validatedData = $request->validate([
            'title' => 'required|string|max:200',
            'content' => 'required|string'
        ]);
        // レコード登録処理
        $post = new Post();
        $post->title = $request->title;
        $post->content = $request->content;
        $post->save();
        return view('post.result');
    }
}

addメソッドにはバリデーションpostsテーブルへの登録処理を実装しています。

バリデーションに関してはLaravelでバリデーションを読んで理解しましょう。

レコード登録処理に関しては以下の流れで実装します。

  1. $post = new Post()Postモデルのインスタンスを作成し、$postへ代入
  2. $post->title = $request->titleとすることで、フォームの入力値をPostモデルインスタンスのtitleプロパティなどに代入
    Postモデルインスタンスにはテーブルのためのプロパティを定義しなくても利用可能です。
  3. $post->save()Postモデルインスタンスに格納されたtitlecontentをレコードとしてインサート

基本的にはこのように、 ①レコード登録するテーブルに対応するモデルインスタンスを作成し、 ②インスタンスのプロパティにフォームの入力値を代入します。その後 ③モデルインスタンスに実装済みのsaveメソッドを呼び出すことでレコード登録が完了します。

saveメソッドは、登録成功時にtrue・失敗時にfalseを返すため、正しくレコード登録されたかどうか確認したい場合はsaveメソッドの返り値を確認しましょう。

保存成功時のビューファイル作成

最後にview('post.result')でビューを返しているので、resources/views/post/result.blade.phpのビューファイルを作成しましょう。保存成功などを表示したり自由に作成してください。

まとめ

これで基本のLaravelでのレコード登録が完了します。バリデーションはテーブルのカラム設定に沿って適切に設定しましょう。そうすることで自動的にバリデーションエラー時にページを戻してくれます。