LaravelのEloquentでレコード登録
更新日 : 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にアクセスが来たときに、PostController
のaddForm
メソッドを実行 します。
次にルーティングで指定した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はPostController
のadd
メソッドで処理を行うように設定したので、PostController
にadd
メソッドを作成していきましょう。
<?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でバリデーションを読んで理解しましょう。
レコード登録処理に関しては以下の流れで実装します。
$post = new Post()
でPost
モデルのインスタンスを作成し、$post
へ代入$post->title = $request->title
とすることで、フォームの入力値をPost
モデルインスタンスのtitle
プロパティなどに代入Post
モデルインスタンスにはテーブルのためのプロパティを定義しなくても利用可能です。$post->save()
でPost
モデルインスタンスに格納されたtitle
とcontent
をレコードとしてインサート
基本的にはこのように、 ①レコード登録するテーブルに対応するモデルインスタンスを作成し、 ②インスタンスのプロパティにフォームの入力値を代入します。その後 ③モデルインスタンスに実装済みのsave
メソッドを呼び出すことでレコード登録が完了します。
save
メソッドは、登録成功時にtrue
・失敗時にfalse
を返すため、正しくレコード登録されたかどうか確認したい場合はsave
メソッドの返り値を確認しましょう。
保存成功時のビューファイル作成
最後にview('post.result')
でビューを返しているので、resources/views/post/result.blade.php
のビューファイルを作成しましょう。保存成功などを表示したり自由に作成してください。
まとめ
これで基本のLaravelでのレコード登録が完了します。バリデーションはテーブルのカラム設定に沿って適切に設定しましょう。そうすることで自動的にバリデーションエラー時にページを戻してくれます。