のぐそんブログ

暗いおじさんがシコシコ書くブログです。

Eloquent(ORM)を利用するメモ(その2)

モデルクラスを利用して、レコードの登録、編集、削除をやってみます。

モデルクラスを利用してレコードを新規登録する

Eloquentを利用してレコードを新規登録するには、次の手順になります。

  1. モデルのインスタンスを作成
  2. インスタンスのプロパティに値を設定
  3. インスタンスを保存する

モデル

/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を削除します。

_tokenCSRF用の非表示フィールドとして自動で設定される値です。

⑤ 値を保存します

取得した値を保存します。
updated_atcreated_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');
    }