Eloquent(ORM)を利用するメモ(その2)
モデルクラスを利用して、レコードの登録、編集、削除をやってみます。
モデルクラスを利用してレコードを新規登録する
Eloquentを利用してレコードを新規登録するには、次の手順になります。
モデル
/app/User.php
を以下のようにします。
バリデーション用のルールはモデル側に定義すると良いようです。
また、プライマリキーのidは自動で番号が振られるので、$guarded
で値がユーザーによって設定されないようにしておきます。 $guarded
を設定した項目はcreate()やfill()、update()で値が設定できなくなります。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { protected $guarded = array('id'); public static $rules = array( 'name' => 'required', 'mail' => 'email', 'age' => 'integer|min:0|max:150' ); }
ビュー
レコード追加用のビューはこんな感じ。
◎ /resources/views/user/add.blade.php
@if(count($errors) > 0) <div> <ul> @foreach($errors->all() as $error) <li>{{$error}}</li> @endforeach </ul> </div> @endif <table> <form action="/user/add" method="post"> {{csrf_field()}} <tr> <th>name:</th> <td><input type="text" name="name" value="{{old('name')}}"></td> </tr> <tr> <th>mail:</th> <td><input type="text" name="mail" value="{{old('mail')}}"></td> </tr> <tr> <th>age:</th> <td><input type="number" name="age" value="{{old('age')}}"></td> </tr> <tr> <th></th> <td><input type="submit" value="送信"></td> </tr> </form> </table>
レコード表示用のビューはこんな感じ。
◎ /resources/views/user/index.blade.php
<table> <tr> <th>name</th> <th>mail</th> <th>age</th> </tr> @foreach ($items as $item) <tr> <td>{{$item->name}}</td> <td>{{$item->mail}}</td> <td>{{$item->age}}</td> </tr> @endforeach </table>
ルート
Route::get('user','UserController@index'); Route::get('user/add', 'UserController@add'); Route::post('user/add', 'UserController@create');
コントローラー
class UserController extends Controller { public function index(Request $request) { $items = User::all(); return view('user.index', ['items' => $items]); } public function add(Request $request) { return view('user.add'); } public function create(Request $request) { $this->validate($request,User::$rules); // ① $user = new User(); // ② $form = $request->all(); // ③ unset($form['_token']); // ④ $user->fill($form)->save(); // ⑤ return redirect('/user'); } }
① バリデーションを実行します。
Userモデルのバリデーションルールを引数として渡します。
② モデルのインスタンスを作成します。
③ リクエストの値を取得します。
リクエスト中身は以下のような感じです。
array:4 [▼ "_token" => "PQlEfeBD6ClcR456T2ipWc7M6QX968C4upzpwQqB" "name" => "山田太郎" "mail" => "tyamada@sample.com" "age" => "33" ]
④ リクエストの中から_tokenを削除します。
_tokenはCSRF用の非表示フィールドとして自動で設定される値です。
⑤ 値を保存します
取得した値を保存します。
updated_at
とcreated_at
は自動で設定されるので、予めテーブルのフィールドとして用意しておく必要があります。
fill
メソッドを利用すると、引数に値をモデルのプロパティとしてまとめてセットしてくれます。
以下のような感じです。
User {#220 ▼ #guarded: array:1 [▶] #connection: null #table: null #primaryKey: "id" #keyType: "int" +incrementing: true #with: [] #withCount: [] #perPage: 15 +exists: false +wasRecentlyCreated: false #attributes: array:3 [▼ "name" => "山田太郎" "mail" => "tyamada@sample.com" "age" => "33" ] ... 中略... }
以下のようなことを簡単にやってくれるイメージです。
$user = new User(); $user -> name = $request->name; ... 中略... $user->save();
モデルクラスを利用してレコードを更新する
レコードの更新は新規登録とほぼ同じです。
違う点としては、更新するフィールドのidを利用して、モデルデータを取得することくらいです。
ビュー
$form
はコントローラーで設定したモデルの情報です。
<table> <form action="/user/edit" method="post"> {{csrf_field()}} <input type="hidden" name="id" value="{{$form->id}}"> <tr> <th>name:</th> <td><input type="text" name="name" value="{{$form->name}}"></td> </tr> <tr> <th>mail:</th> <td><input type="text" name="mail" value="{{$form->mail}}"></td> </tr> <tr> <th>age:</th> <td><input type="number" name="age" value="{{$form->age}}"></td> </tr> <tr> <th></th> <td><input type="submit" value="更新"></td> </tr> </form> </table>
ルート
Route::get('user/edit', 'UserController@edit'); Route::post('user/edit', 'UserController@update');
コントローラー
class UserController extends Controller { public function index(Request $request) { $items = User::all(); return view('user.index', ['items' => $items]); } public function edit(Request $request) { $user = User::find($request->id); // ① return view('user.edit',['form' => $user]); // ② } public function update(Request $request) { $this->validate($request,User::$rules); $user = User::find($request->id); // ③ $form = $request->all(); unset($form['_token']); $user->fill($form)->save(); return redirect('/user'); } }
① クエリパラメーターからidを取得する
http://localhost/user/edit?id=2
のようなアドレスでアクセスし、ユーザーのidを取得します。
② 取得したユーザー情報をform
というキーに設定する
ビュー側でform変数にアクセスしてユーザー情報を表示します。
③ モデルクラスを利用して情報を取得
find
を利用してidからフィールド情報を取得します。
モデルクラスを利用してレコードを削除する
削除は編集とほとんど同じです。
モデルクラスのdelete
メソッドを利用します。
public function delete(Request $request) { $this->validate($request,User::$rules); $user = User::find($request->id); $user->delete(); return redirect('/user'); }