次は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 }}">
今回はここまで。