47
47

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Laravel入門】CRUD実装〜編集

Last updated at Posted at 2018-05-06

次は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の編集機能だ。しかし、新規登録機能と同様に1つの機能がeditupdateの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アクションも、下記のような書き方ができる。

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

  • 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 }}">

今回はここまで。

47
47
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
47

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?