2018/10/12

前回はDBのTABLEを取得して表示させました。
今回はフォームで入力した値をDBのTABLEに保存させる作業をします。
Eloquent ORMによるTABLEへの保存方法
入力された値をTABLEへ保存するにはControllerファイルに記述します。
まず定義したModelを利用するためにuseでインポートします。
例えばExampleというモデル名をつくったなら
: use App/Example; :
となります。
続いてstoreメソッドで保存させる処理をするなら
public function store(Request $request)
{
//インスタンス作成
$example = new Example();
//Inputタグのname属性がonamaeの場合 $request->onamae で値を受け取る
//モデルインスタンスのname属性に代入
$example->name = $request->onamae;
//saveメソッドが呼ばれると新しいレコードがデータベースに挿入される
$example->save();
}
なお、saveが呼び出された時に created_at と updated_at タイムスタンプは自動的に設定されます。
Eloquent ORMによるTABLEへの保存は以上です。
SQLを書かなくてもDBのTABLEを操作できるところが特徴です。
DB::insert に比べ、オブジェクト指向っぽく直感的に書くことができますね。
チュートリアル
以前作成したフォームをカスタマイズします。
入力したデータをDBのTABLEに保存します。
QueryBuilder(DB::*)ではなくEloquent ORMを使います。
実現したいこと
- フォームで入力した値をDBのTABLEに保存する
- Bootstrapをカスタマイズ(メニューを追加)
手順
1. コントローラの編集

前回作成した仕様ではフォームで入力したデータはControllerのpostIndexメソッドで値を受け取っていました。
DBのTABLEへのレコードの挿入はpostIndexメソッドに記述します。
#App\Controllers\GreetingController.php
:
#greeting/indexにPOST送信された時の処理
public function postIndex(Request $request)
{
/*
* バリデーション
*/
$this->validate($request, [
'onamae' => 'required',
]);
/*
* 新しいレコードの追加
*/
#Greetingモデルクラスのオブジェクトを作成
$greeting = new Greeting();
#Greetingモデルクラスのプロパティに値を代入
$greeting->onamae = $request->input('onamae');
#Greetingモデルクラスのsaveメソッドを実行
$greeting->save();
/*
* View表示
*/
#変数に代入
$res = "こんにちは!" . $request->input('onamae')."さん!!";
#Viewメソッドに引数を指定して返す
return view('greeting', ['message' => $res]);
}
:
2. ビューファイルの編集

以前作成したビューファイルを少しカスタマイズします。
メニューを入れて、一覧ページ( all.blade.php )にリンクをかけます。
これですぐにDBのTABLEにレコードが挿入できたか確認できます。
Bootstrapにメニューバーを追加するにはBootstrap Componetsのページが参考になります。
メニューバーは共通で利用するコンポーネントなので親テンプレートに記述します。
{{-- 親テンプレート --}}
{{-- resources/layouts/master.blade.php --}}
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<!-- InternetExplorerのブラウザではバージョンによって崩れることがあるので、互換表示をさせないために設定するmetaタグです。 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- レスポンシブWebデザインを使うために必要なmetaタグです。 -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>@yield('title')</title>
<!-- コンパイルして圧縮された最新版の CSS -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
<!-- オプションのテーマ -->
<style>
body {
padding-top: 40px;
padding-bottom: 40px;
background-color: #eee;
}
.form-signin {
max-width: 330px;
padding: 15px;
margin: 0 auto;
}
.form-signin .form-signin-heading,
.form-signin .checkbox {
margin-bottom: 10px;
}
.form-signin .form-control {
position: relative;
height: auto;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 10px;
font-size: 16px;
}
.form-signin .form-control:focus {
z-index: 2;
}
.form-signin input[type="text"] {
margin-bottom: 10px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
</style>
</head>
<body>
{{-- ↓↓↓ 今回はここ(メニュー)を追加します。 ↓↓↓ --}}
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/mylaravel/public/greeting">簡易フォーム</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li><a href="/mylaravel/public/greeting">入力フォーム</a></li>
<li><a href="/mylaravel/public/greeting/all">一覧表示</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
{{-- ↑↑↑ 今回はここ(メニュー)を追加します。 ↑↑↑ --}}
<!-- 少しいじる場合は inline style で記述します -->
<div class="container" style="margin-top: 30px;">
<h2>@yield('title')</h2>
@yield('content')
</div><!-- /container -->
<!-- jQuery読み込み -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<!-- BootstrapのJS読み込み -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</body>
</html>
3. 動作確認
WEBサーバが起動しているのを確認して
http://localhost/mylaravel/public/greeting
にアクセスします。
何か適当に文字を入力して送信ボタンを押します。

次にちゃんとデータがDBのTABLEに入っているかメニューの "一覧" をクリックします。
入力したデータが表示されていればOKです。

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。