Laravelでデータの削除(実践編その6)

今日は、PHPフレームワークLaravelで、データの削除を行ってみたいと思います。データを削除するときに気をつけないといけないのは、クリック間違いで、大事なデータが削除されないように、ワンクッション置くことだと思います。そこで、一覧ページからの削除では無く、明細ページから削除するように作成したいと思います。

1. それでは、一覧ページ(トップページ)から、明細(detail)ページへのリンクを作成します。

laravel/application/views/collection/index.blade.php

@layout('layouts.master')
@section('navigation')
 <li>{{ HTML::link('collection/index','トップページ') }}</li>
 <li>{{ HTML::link('collection/create','新規作成') }}</li>
@endsection
@section('content')
<table class="table table-striped table-bordered">
 <tr>
 <th>id</th>
 <th>タイトル</th>
 <th>作成日</th>
 <th>更新日</th>
 <th>保管場所</th>
 <th>処理</th>
 </tr>
@foreach($collections as $row)
 <tr>
 <td>{{ $row->id }}</td>
 <td>{{ $row->title }}</td>
 <td>{{ $row->created_at }}</td>
 <td>{{ $row->updated_at }}</td>
 <td>{{ $row->save_space }}</td>
 <td><i class="icon-pencil"></i>
 {{ HTML::link_to_action('collection@edit','編集',array($row->id)) }}
 <i class="icon-hand-right"></i>
 {{ HTML::link_to_action('collection@detail','明細',array($row->id)) }}</td>
 </tr>
@endforeach
</table>
{{ $links }}
@endsection

2. detailビューファイルを作成します。

laravel/application/views/collection/detail.blade.php

@layout('layouts.master')
@section('navigation')
 <li>{{ HTML::link('collection/index','トップページ') }}</li>
 <li>{{ HTML::link('collection/create','新規作成') }}</li>
@endsection
@section('content')
<table class="table table-bordered">
 <tr>
 <th>id</th>
 <td>{{ $collection->id }}</td>
 </tr>
 <tr>
 <th>タイトル</th>
 <td>{{ $collection->title }}</td>
 </tr>
 <tr>
 <th>作成日</th>
 <td>{{ $collection->created_at }}</td>
 </tr>
 <tr>
 <th>更新日</th>
 <td>{{ $collection->updated_at }}</td>
 </tr>
 <tr>
 <th>保管場所</th>
 <td>{{ $collection->save_space }}</td>
 </tr>
 <tr>
 <th>処理</th>
 <td>
 <i class="icon-pencil"></i>
 {{ HTML::link_to_action('collection@edit','編集',array($collection->id)) }}
 <i class="icon-remove"></i>
 {{ HTML::link_to_action('collection@delete','削除',array($collection->id)) }}
 </td>
 </tr>
</table>
@endsection

3. そしてdetailアクションを下記のように作成します。

laravel/application/controllers/collection.php

//明細ページ
 public function action_detail($id){
 //Fluentクエリービルダーでデータの選択
 $data['collection']=DB::table('collections')->find($id);
 //データを渡してビューを開く
 return View::make('collection.detail',$data);
 }

4. 尚、記述するほどのことでは、無いのですが、一応EloquentORMを使用してデータ選択した場合を下記に記述しておきます。

public function action_detail($id){
//EloquentORMでデータの選択
 $data['collection']=Collection::find($id);
 //データを渡してビューを開く
 return View::make('collection.detail',$data); 
 }

5. deleteビューファイルを下記のように作成します。

laravel/application/views/collection/delete.blade.php

@layout('layouts.master')
@section('navigation')
 <li>{{ HTML::link('collection/index','トップページ') }}</li>
 <li>{{ HTML::link('collection/create','新規作成') }}</li>
@endsection
@section('content')
<div class="row">
<div class="span12 alert alert-error">
下記のデータを削除します。よろしいですか。
</div>
</div>
<div class="row">
<div class="span6 offset2 hero-unit">
<table class="table">
 <tr>
 <th>id</th>
 <td>{{ $collection->id }}</td>
 </tr>
 <tr>
 <th>タイトル</th>
 <td>{{ $collection->title }}</td>
 </tr>
 <tr>
 <th>作成日</th>
 <td>{{ $collection->created_at }}</td>
 </tr>
 <tr>
 <th>更新日</th>
 <td>{{ $collection->updated_at }}</td>
 </tr>
 <tr>
 <th>保管場所</th>
 <td>{{ $collection->save_space }}</td>
 </tr>
 <tr>
</table>
{{ Form::open() }}
{{ Form::hidden('id',$collection->id) }}
{{ Form::submit('データ削除',array('class'=>'btn btn-danger')) }}
{{ Form::close() }}
</div>
</div>
@endsection

6. deleteアクションを下記のように作成します。

laravel/application/controllers/collection.php

//削除ページ
 public function action_delete($id){
 //POSTされたIDが一致したら
 if(Input::get('id')==$id){
 //Fluentクエリービルダーでデータの削除
 //$delete=DB::table('collections')->delete($id);
 //EloquentORMでデータの削除
 $delete=Collection::find($id)->delete();
 //トップページへリダイレクト
 return Redirect::to('collection/index');
 }
 //EloquentORMでデータの選択
 $data['collection']=Collection::find($id);
 //データを渡してビューを開く
 return View::make('collection/delete',$data); 
 }
  • 6行目:コメントアウトしていますが、Fluentクエリービルダーでは、deleteメソッドにIDを渡すだけで、データを削除することが出来ます。EloquentORMでも同じようにCollection::delete($id)で削除できるのかなと思ったのですが、さすがにこれでは、削除できませんでした。
  • 8行目:findメソッドで、データを取得してdeleteメソッドで削除します。

7. 一応deleteページが確認ページも兼用していますので、面倒な人は、トップページ(データ一覧ページ)に削除用のリンクを作成しても構わないと思いますが、念のため、私は明細ページから削除するようにしています。

本日は以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ