データの更新、削除

データの更新


今回は登録したデータの編集、削除をやっていきます。

Model からデータを取得してきて、内容を編集して再び保存していきます。

Controller の実装


TodoController にedit アクションと update アクションを追加していきます。

edit Actionは編集画面、update Actionは編集画面から送信されたフォームデータを処理する部分です。

edit update アクションを以下の内容で追記してください。

public function edit(Request $request)
  {
      // Todo Modelからデータを取得する
      $todos = Todo::find($request->id);
      if (empty($todos)) {
        abort(404);    
      }
      return view('todo.edit', ['todo_form' => $todos]);
  }

  public function update(Request $request)
  {
    // Validationをかける
    $this->validate($request, Todo::$rules);
    // Todo Modelからデータを取得する
    $todo = Todo::find($request->get('id'));
    // 送信されてきたフォームデータを格納する
    $todo_form = $request->all();

    unset($todo_form['_token']);
    unset($todo_form['remove']);

    // 該当するデータを上書きして保存する
    $todo->fill($todo_form)->save();

    return redirect('todo');

 

編集リンクを押した時に、そのデータの id を取得するようにしておき、

モデルからその id のデータを取得してきます。

そのデータを変更してまた保存していきます。

一つだけ補足して説明すると、

$todo->fill($todo_form)->save();

は、

$todo->fill($todo_form);
$todo->save();

を短縮して書いたものです。

View の実装


resources/views/todo/edit.blade.php を新規作成して、以下を記述します。

@extends('layouts.layouts')
@section('title', '予定の編集')

@section('content')
    <div class="container">
        <div class="row">
            <div class="col-md-8 mx-auto">
                <h2>予定編集</h2>
                <form action="{{ action('Admin/TodoController@update') }}" method="post" enctype="multipart/form-data">
                    @if (count($errors) > 0)
                        <ul>
                            @foreach($errors->all() as $e)
                                <li>{{ $e }}</li>
                            @endforeach
                        </ul>
                    @endif
                    <div class="form-group row">
                        <label class="col-md-2" for="title">タイトル</label>
                        <div class="col-md-10">
                            <input type="text" class="form-control" name="title" value="{{ $todo_form->title }}">
                        </div>
                    </div>
                    <div class="form-group row">
                        <label class="col-md-2" for="space">場所</label>
                        <div class="col-md-10">
                            <input type="text" class="form-control" name="space" value="{{ $todo_form->space }}">
                        </div>
                    </div>
                    <div class="form-group row">
                        <label class="col-md-2" for="deadline">期限</label>
                        <div class="col-md-10">
                            <input type="text" class="form-control" name="deadline" value="{{ $todo_form->deadline }}">
                        </div>
                    </div>
                    <div class="form-group row">
                        <label class="col-md-2" for="priority">重要度</label>
                        <div class="col-md-10">
                            <input type="text" class="form-control" name="priority" value="{{ $todo_form->priority }}">
                        </div>
                    </div>
                    <input type="hidden" name="id" value="{{ $todo_form->id }}">
                    {{ csrf_field() }}
                    <input type="submit" class="update-btn" value="更新">
                </form>
            </div>
        </div>
    </div>
@endsection

また、 resources/views/todo/index.blade.php を編集リンクを表示するように修正します。

@extends('layouts.layouts')
@section('title', 'todos一覧')

@section('content')
    <div class="container">
        <div class="row">
            <h2>Todos一覧</h2>
        </div>
        <div class="row">
            <div class="col-md-4">
                <a href="{{ action('Admin/TodoController@add') }}" role="button" class="btn btn-primary">新規作成</a>
            </div>
            <div class="col-md-8">
                <form action="{{ action('Admin/TodoController@index') }}" method="get">
                    <div class="form-group row">
                        <label class="col-md-2">タイトル</label>
                        <div class="col-md-8">
                            <input type="text" class="form-control" name="cond_title" value="{{ $cond_title }}">
                        </div>
                        <div class="col-md-2">
                            {{ csrf_field() }}
                            <input type="submit" class="btn btn-primary" value="検索">
                        </div>
                    </div>
                </form>
            </div>
        </div>
        <div class="row">
            <div class="list-news col-md-12 mx-auto">
                <div class="row">
                    <table class="table table-dark">
                        <thead>
                            <tr>
                            <th>ID</th>
                            <th>タイトル</th>
                            <th>場所</th>
                            <th>期限</th>
                            <th colspan="2">重要度</th>
                            </tr>
                        </thead>
                        <tbody>
                            @foreach($todos as $todo)
                                <tr>
                                <td>{{ $todo->id }}</td>
                                <td>{{ str_limit($todo->title, 100) }}</td>
                                <td>{{ str_limit($todo->space, 100) }}</td>
                                <td>{{ str_limit($todo->deadline, 100) }}</td>
                                <td>{{ str_limit($todo->priority, 100) }}</td>
                                <td>
                                    <div>
                                        <a href="{{ action('Admin\TodoController@edit', ['id' => $todo->id]) }}">編集</a>
                                    </div>
                                </td>
                                </tr>
                            @endforeach
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
@endsection

Routing の実装


web.php に以下を追記してください。

Route::get('todo/edit/{id}', 'Admin\TodoController@edit'); // 追記
Route::post('todo/edit', 'Admin\TodoController@update'); // 追記

Routing の設定ができたら実際に変更できるか試してみましょう。

データの削除


データの削除を実装していきます。

編集と同じように Model からデータを取得してからそれを削除していきます。

Cotroller の実装


public function delete(Request $request)
  {
      // 該当するTodo Modelを取得
      $todos = Todo::find($request->id);
      // 削除する
      $todos->delete();
      return redirect('todo/');
  }

データをセーブするときは、$todo->save();でsaveメソッドを利用しましたが、データの場合はdelete()メソッドを使います。

また、 resources/views/todo/index.blade.php を削除リンクを表示するように修正します。

@extends('layouts.layouts')
@section('title', 'todos一覧')

@section('content')
    <div class="container">
        <div class="row">
            <h2>Todos一覧</h2>
        </div>
        <div class="row">
            <div class="col-md-4">
                <a href="{{ action('Admin\TodoController@add') }}" role="button" class="btn btn-primary">新規作成</a>
            </div>
            <div class="col-md-8">
                <form action="{{ action('Admin\TodoController@index') }}" method="get">
                    <div class="form-group row">
                        <label class="col-md-2">タイトル</label>
                        <div class="col-md-8">
                            <input type="text" class="form-control" name="cond_title" value="{{ $cond_title }}">
                        </div>
                        <div class="col-md-2">
                            {{ csrf_field() }}
                            <input type="submit" class="btn btn-primary" value="検索">
                        </div>
                    </div>
                </form>
            </div>
        </div>
        <div class="row">
            <div class="list-news col-md-12 mx-auto">
                <div class="row">
                    <table class="table table-dark">
                        <thead>
                            <tr>
                            <th>ID</th>
                            <th>タイトル</th>
                            <th>場所</th>
                            <th>期限</th>
                            <th colspan="2">重要度</th>
                            </tr>
                        </thead>
                        <tbody>
                            @foreach($todos as $todo)
                                <tr>
                                <td>{{ $todo->id }}</td>
                                <td>{{ str_limit($todo->title, 100) }}</td>
                                <td>{{ str_limit($todo->space, 100) }}</td>
                                <td>{{ str_limit($todo->deadline, 100) }}</td>
                                <td>{{ str_limit($todo->priority, 100) }}</td>
                                <td>
                                    <div>
                                        <a href="{{ action('Admin\TodoController@edit', ['id' => $todo->id]) }}">編集</a>
                                    </div>
                                    <div>
                                        <a href="{{ action('Admin\TodoController@delete', ['id' => $todo->id]) }}">削除</a>
                                    </div>
                                </td>
                                
                                </tr>
                            @endforeach
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
@endsection

Routing の実装


web.php に以下を追記してください。

Route::get('todo/delete/{id}', 'Admin\TodoController@delete');

削除機能は画面を持たず、id で指定されたモデルをすぐに削除します。

コントローラの最後で一覧画面にリダイレクトしているため、削除機能は画面を持っていません。

そのため、ビューテンプレートは不要です。

ブラウザでアクセスして、削除機能の動作を確認してみましょう。

カテゴリー

アーカイブ

Close Bitnami banner
Bitnami