【Laravel入門】CRUD実装〜編集

次はCRUDのUpdate（更新）だ。投稿された記事を編集できるようにする。

# コントローラ追記

```ArticleController.php
public function edit(Request $request)
{
    $article = Article::find($request->id);
    return view('article.edit', ['article' => $article]); 
}

public function update(Request $request)
{
    $article = Article::find($request->id);
    $article->title = $request->title;
    $article->content = $request->content;
    $article->save();
    return redirect('/');
}
```

今回実装する機能はCRUDの``Update（更新）``つまり``articleの編集機能``だ。しかし、新規登録機能と同様に１つの機能が``edit``と``update``の２つのアクションに別れている。これを説明していく。

## editアクション

- editアクションは``articleの編集用画面を表示``させる。
- 既に存在しているarticleの編集作業を行うため、``編集用画面には過去に入力した内容が表示される``ようにしたい。そのためのデータを得るアクションなので、``HTTPメソッド``は``GET``となる。
- ``Requestクラス``により作成された``HTTPリクエストインスタンス``が``$request``に代入される。
- ``$request``には``GETで受け取った情報（ユーザーが既に作成した記事）``が入っている。
- ``Articleクラス``の``findメソッド``で、``指定されたid（$requestのidプロパティ）に該当するレコードを取得``し、``$article``へ代入する。
- 編集用画面``'article.edit'ビュー``で``'article'をキー``としてデータが使用できるように、$articleを渡す。

## updateアクション

- updateアクションは``articleを編集後、送信ボタンをクリックしその内容を送信した後``に``articlesテーブルに編集されたデータを格納する``ために行われる。そのため``HTTPメソッド``は``POST``となる。
- 引数に``Request $request``を指定しているので、``HTTPリクエストインスタンス``が``$request``に代入される。
- ``$request``には``POSTで受け取った情報（ユーザーが編集した記事）``が入っている。
- ``findメソッド``で、``指定されたid（$requestのidプロパティ）に該当するレコードを取得``し、``$article``へ代入する。
- この``$article``に代入されるレコードは編集前のものである。これを、編集後の内容が代入されている``$request``の内容に更新しなければならない。
- ``$request``から各プロパティを呼び出し、``$article``の各プロパティとして代入する。（上書き保存のイメージだ。）
- モデルの``saveメソッド``を実行し、内容をデータベースに書き込む。
- 上記の作業が終わったら、``'/（トップページ）'ビュー``へリダイレクトする。


このupdateアクションも、下記のような書き方ができる。

```ArticleController.php
$article = Article::find($request->id);
$form = $request->all();
unset($form['_token']);
$article->fill($form)->save();
return redirect('/');
```

- ``findメソッド``で、``指定されたid（$requestのidプロパティ）に該当するレコードを取得``し、``$article``へ代入する。
- モデルの``allメソッド``で``$request``から全てのプロパティを呼び出し、``$form``に代入する。
- 全てのプロパティを取得すると必要のない``_tokenプロパティ``まで取得してしまうので、モデルの``unsetメソッド``でこれを削除する。
- モデルの``fillメソッド``で``$articleのプロパティ``を``$form``の内容に指定する。
- モデルの``saveメソッド``を実行し、内容をデータベースに書き込む。
- ``'/（トップページ）'ビュー``へリダイレクトする。

# ルーティング設定

こちらも、HTTPメソッドの違いでアクションを振り分けている。

```web.php
Route::get('/article/edit', 'ArticleController@edit')->name('article_edit');
Route::post('/article/edit', 'ArticleController@update')->name('article_update');
```

# ビュー作成

``resources/views/articleディレクトリ``に``edit.blade.php``を作成し、編集する。

なお``<input type='hidden' name='id' value='{{ $article->id }}'>``の記述により、表示はされないが``idプロパティの値``も受け渡されている。これは、投稿ボタンをクリックした後に行われるupdateアクションで、``idプロパティの値を基準に更新対象のデータを探すため``だ。

```resources/views/article/edit.blade.php
@extends('...layouts.layout')

@section('article_edit')
    投稿編集<br>

    <form action='{{ route('article_update') }}' method='post'>
        {{ csrf_field() }}
            <input type='hidden' name='id' value='{{ $article->id }}'><br>
            ユーザーID：{{ $article->user_id }}<br>
            タイトル：<input type='text' name='title' value='{{ $article->title }}'><br>
            内容：<input type='text' name='content' value='{{ $article->content }}'><br>
            <input type='submit' value='投稿'>
    </form>
@endsection
```

こちらの記述も忘れずに。

```resources/views/layouts/layout.blade.php
@yield('article_edit')
```

# どこでidを指定するのか

上記の作業を行なっても``articleのidはどこで指定するのか``という問題が残ってしまう。

これについては、今回は``リクエストパラメータ``という方法を使用している。URLに直接idを指定する方法だ。リクエストパラメータについては、以下の記事を参考にして欲しい。

[リクエストパラメータ 【 request parameter 】 GETパラメータ / GET parameter](http://e-words.jp/w/リクエストパラメータ.html)

- URLに``articleのid``を直接指定する。URLの末尾に``?``を付けて``id=5``と記述すれば、idの値が5のarticleを呼び出せる。

```
http://localhost:8000/article/edit?id=5
```

- ビューを編集してリンクを作成する。なお、URLの記述は上記と全く同じになる。これを一覧表示で使用した``index.blade.php``に記述する。

```resources/views/article/index.blade.php
<a href="{{ route('article_edit') }}?id={{ $article->id }}">
```

今回はここまで。