次はCRUDのUpdate(更新)だ。投稿された記事を編集できるようにする。
コントローラ追記
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の編集機能だ。しかし、新規登録機能と同様に1つの機能がeditとupdateの2つのアクションに別れている。これを説明していく。
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アクションも、下記のような書き方ができる。
$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メソッドの違いでアクションを振り分けている。
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プロパティの値を基準に更新対象のデータを探すためだ。
@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
こちらの記述も忘れずに。
@yield('article_edit')
どこでidを指定するのか
上記の作業を行なってもarticleのidはどこで指定するのかという問題が残ってしまう。
これについては、今回はリクエストパラメータという方法を使用している。URLに直接idを指定する方法だ。リクエストパラメータについては、以下の記事を参考にして欲しい。
リクエストパラメータ 【 request parameter 】 GETパラメータ / GET parameter
- URLに
articleのidを直接指定する。URLの末尾に?を付けてid=5と記述すれば、idの値が5のarticleを呼び出せる。
http://localhost:8000/article/edit?id=5
- ビューを編集してリンクを作成する。なお、URLの記述は上記と全く同じになる。これを一覧表示で使用した
index.blade.phpに記述する。
<a href="{{ route('article_edit') }}?id={{ $article->id }}">
今回はここまで。