LaravelのEloquentでレコード削除
更新日 : 2020年02月05日
LaravelのEloquentを利用してレコード取得・レコード登録まで行いました。
今回はEloquentを利用してレコード削除を実装していきます。簡単なフォームを利用して削除したいレコードを選択し、削除できるようにしてみましょう。
事前準備
レコード取得とレコード登録で利用したposts
テーブル・Post
モデル・PostController
をそのまま利用するので、事前に前2つの記事内容の実装をしておきましょう。
削除選択のフォーム作成
今回は選択した記事を削除できるように記事リストを表示して選択削除できるようにしましょう。
まずは記事リスト用のURLを作成するためにweb.php
を編集します。前回の記事で作成したグループ化したルーティングを利用して追記します。
Route::prefix('post')->group(function () {
// フォーム表示用
Route::get('add', 'PostController@addForm');
// POSTデータを受け取る用
Route::post('add', 'PostController@add');
// 記事リストを表示するフォーム
Route::get('list', 'PostController@list');
});
Route::get('list', 'PostController@list');
が追記した部分です。これでhttp://localhost:8888/Laravelのドキュメントルート/post/list
で記事リストを表示するURLの完成です。
PostController@list
となっているので、PostController
にlist
メソッドを作成してみましょう。
public function list() {
$posts = Post::all();
return view('post.list', ['posts' => $posts]);
}
このような形でメソッドを追加しました。記事の全リストを取得してresources/views/post/list.blade.php
にデータを渡してます。次にこのビューファイルを作成しましょう。
<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>記事リスト</title>
<!-- Fonts -->
<link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet">
<!-- Styles -->
<style>
html, body {
background-color: #fff;
color: #636b6f;
font-family: 'Nunito', sans-serif;
font-weight: 200;
height: 100vh;
margin: 0;
}
.flex-center {
align-items: center;
margin: 100px 300px 100px 300px;
justify-content: center;
}
.position-ref {
position: relative;
}
</style>
</head>
<body>
<div class="flex-center position-ref">
<h1>ブログ記事リスト</h1>
<form method="POST" action="delete">
@csrf
<table border="1" cellspacing="0" cellpadding="5" align="left">
<thead>
<tr>
<th>選択</th><th>id</th><th>タイトル</th>
</tr>
</thead>
<tbody>
@foreach ($posts as $post)
<tr>
<td><input type="checkbox" name="ids[]" value="{{ $post->id }}"></td>
<td>{{ $post->id }}</td>
<td>{{ $post->title }}</td>
</tr>
@endforeach
</tbody>
</table>
<br>
<input type="submit" value="選択した記事を削除">
</form>
</div>
</body>
</html>
このような形で記事リストと削除フォームを同時に定義しました。チェックボックスにチェックを入れてボタンを押すと、選択された記事idがdelete
へ送信されます。
送信先のdelete
のページを作成して削除機能を実装してみましょう。
POSTデータを受け取り、受け取った記事idで記事を削除
削除処理を実行するdelete
を作成しましょう。web.php
に以下を追記します。
Route::prefix('post')->group(function () {
// フォーム表示用
Route::get('add', 'PostController@addForm');
// POSTデータを受け取る用
Route::post('add', 'PostController@add');
// 記事リストを表示するフォーム
Route::get('list', 'PostController@list');
// 選択された記事を削除する処理
Route::post('delete', 'PostController@delete');
});
最後にRoute::post('delete', 'PostController@delete');
を追記しました。これでhttp://localhost:8888/Laravelのドキュメントルート/post/delete
にPOSTされた記事idリストの記事データが削除されることになります。
コントローラーの方にもdelete
メソッドを追加していきましょう。
public function delete(Request $request) {
// バリデーション
$validatedData = $request->validate([
'ids' => 'array|required'
]);
Post::destroy($request->ids);
return redirect('post/list');
}
バリデーションを一応行っています。実際に削除処理を行っているのはPost::destroy($request->ids);
です。Eloquentモデルにあるdestroy
メソッドを呼び出しています。
destroy
メソッドの引数には主キーを入れます。このdestroy
メソッドの引数は、主キーを1つだけ入れても、主キーの配列やコレクションでもOKです。引数に入れた主キーに対応するレコードが削除されます。
最後にreturn redirect('post/list');
としています。redirect
を利用することで引数に入れたURLにリダイレクトしてくれます。そのため、これで削除後に記事リストのページへ自動的に移動します。
これで記事リストからチェックボックスで選択して、削除ボタンをクリックすると記事が削除され、再度記事リストにリダイレクトされます。
リダイレクト後は、選択した記事が削除されているため、記事リストには表示されなくなります。一応表示結果は以下のようになります。

削除後は以下のように表示されるはずです。

まとめ
今回はレコード一覧(記事一覧)の表示と、選択されたレコードの削除を行いました。
これでデータベースのCRUDのうち、Updateを除く全ての処理を行いました。Updateに関しては改めて記事にしますが、レコード登録で利用したsave
メソッドを利用するので、難しくはないかと思います。