Laravel入門編7・データを物理削除する方法

【Laravel入門7】データを物理削除する方法

今回はDBのデータを削除する方法を解説します。

データベースに登録したデータを削除する機能は、どんなシステムでもほぼ必ず存在します。

データの削除は「物理削除」と「論理削除」の2種類ありますが、今回は「物理削除」を行う方法です。

この記事を読めば、

  • 「物理削除」と「論理削除」の違い
  • 「物理削除」をする方法

が理解できます。

Laravelを活用してプログラムを作成する際に、必ず必要になってくる知識であり、今後役立つこと間違いありません。

ぜひ最後までお読みください!

バージョン9.51.0の「Laravel」で説明します

目次

そもそも、「物理削除」と「論理削除」とは?

データベースのデータを削除する方法は、「物理削除」と「論理削除」の2パターンあります。

物理削除とは

「物理削除」とは、SQLでいうと「DELETE文」を走らせて、レコードを完全に削除してしまうこと。

DELETEするだけなので実装が容易なことや、ストレージの圧迫を阻止できるメリットがあります。
デメリットは完全に削除してしまうので、データを戻すのが簡単ではないことです。

物理削除とは

一方の「論理削除」とは、SQLでいうと「UPDATE文」を走らせて、テーブルに持たせている削除を判定するカラムを更新することです。

削除を判定するカラムとは、たとえば会員を管理するテーブルに「delete_flg」というカラムを用意しておいて、

「delete_flg」に「0」が入っているレコード:利用可能なのでログイン可能
「delete_flg」に「1」が入っているレコード:退会しているのでログイン不可

というように判定します。

「論理削除」は誤って削除してしまった時に、カラム値を編集するだけで容易にデータを戻せるメリットがあります。
しかし、いつまでも削除したデータが残ってしまうので、ストレージが圧迫してしまうデメリットを持っています。

システムやプロジェクトなどによって「物理削除」なのか「論理削除」なのか異なるので、削除画面を実装する際は必ず確認をしましょう!

今回は「物理削除」を行う方法を解説します。

今回使用するテーブル

名前  タイプ  その他設定
idint主キー
login_idvarchar(50)ユニーク
passwordvarchar
created_attimestamp
updated_attimestamp
テーブル名「managers」

テーブルの作成は入門編3を参考にしてください。

また、以下の記事で登録画面を作成して、いくつかデータの登録も行ってくださいね。

今回活用するファイル

今まで入門編を解説してきた中で、下記のファイルを利用するので用意をお願いします。
このブログの入門編を順番に行っている場合は、用意不要です。

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

// 2023.02.18 追記
Route::get('/hello', 'App\Http\Controllers\HelloController@index');

// 2023.03.11 追記
Route::get('/register_manager', 'App\Http\Controllers\ManagerController@index');
Route::post('/register_manager', 'App\Http\Controllers\ManagerController@register');

// 2023.03.25 追記
Route::get('/list_manager', 'App\Http\Controllers\ManagerController@list');

一覧画面に削除ボタンを配置する

でははじめに、一覧画面に削除ボタンを配置するようにビューファイルに追記していきましょう!

手順1:ビューファイルを編集する

「Laravel入門6」で作成した一覧を表示するビューファイル「list_manager.blade.php」を編集します。

各ログインIDの横に削除ボタンを設置するようにします。

以下のようにソースを変更しましょう!

<h2>管理者一覧</h2>
<table>
    @foreach ($Manager_List as $Manager)
    <tr>
        <td>{{ $Manager->login_id }}</td>
        <!-- 削除ボタンを追加 ここから -->
        <td>
            <form action="{{ url('list_manager') }}" method="POST">
                @csrf
                @method('DELETE')
                <input type="hidden" name="login_id" value="{{ $Manager->login_id }}"/>
                <button type="submit">削除</button>
            </form>
        </td>
        <!-- 削除ボタンを追加 ここまで -->
    </tr>
    @endforeach
</table>

追記したのは以下の部分ですね。

        <!-- 削除ボタンを追加 ここから -->
        <td>
            <form action="{{ url('list_manager') }}" method="POST">
                @csrf
                @method('DELETE')
                <input type="hidden" name="login_id" value="{{ $Manager->login_id }}"/>
                <button type="submit">削除</button>
            </form>
        </td>
        <!-- 削除ボタンを追加 ここまで -->

「@csrf」は、ユーザーになりすまして不正行為を行うハッキングなどを防ぐためのセキュリティ対策です。
フォームを記述する際は必ず書くようにしましょう。

次の「@method(‘DELETE’)」が今回の重要箇所です。

「@method」では、HTTPメソッドを指定できます。

HTTPメソッドとは、
クライアントがサーバーにしてほしいことを依頼する手段で、主に以下の4つを使います。
「GET」:データを取得するときに利用する
「POST」:サーバーにデータを送信するときに利用する(主に新規登録の時)
「PUT」:サーバーにデータを送信するときに利用する(主に更新の時)
「DELETE」:既存データを削除したいときに利用する

今回使いたいのは「DELETE」ですね!

しかし、<form>(フォームタグ)のmethodでは、「POST」か「GET」しか指定できません。

<form>のmethodに「DELETE」を記述するとエラーになるので注意しましょう!

そこで、Laravelの「@method」を用いてDELETEを指定します。

手順2:一旦、ブラウザで確認する

ここまででビューファイルの編集は終わりましたので、一旦ブラウザで「http://localhost/test-laravel/public/list_manager」にアクセスして表示に問題がないか確認してみましょう!

上記のように「managers」テーブルに登録されているIDの横に、削除ボタンが表示されましたか?
表示されれば、ここまでの作業に問題はありません!

人によって登録したIDは異なるので、phpMyadminで「managers」テーブルに登録されているデータと見比べてみてくださいね。

ルーティングの設定ファイルを編集する

では次に、ルーティングの設定ファイルを編集しましょう!

Route::DELETE('/list_manager', 'App\Http\Controllers\ManagerController@delete');

「Route::DELETE」にします。
前述でHTTPメソッドを「DELETE」リクエストにしているからです。

「POST」や「GET」にしないように注意しましょう!

コントローラーファイルを編集する

では最後にコントローラーファイルを編集します。

手順1:コントローラーファイルを編集する

「ManagerController.php」に以下のソースを追記します。

    public function delete(Request $request)
    {
        Manager::where('login_id', $request->login_id)->delete();
        return redirect('list_manager');
    }

「where()」で削除するデータを指定します。
今回はユニークである「login_id」を指定しました。

最後に「delete()」でSQLでいうDELETE文が実行されます。

手順2:ブラウザで動作確認をする

では、ソースの記述は終わりましたので、動作確認を行いましょう!

ブラウザで「http://localhost/test-laravel/public/list_manager」にアクセスします。

先ほど確認したときと変わりませんね。
では次に、どれか削除ボタンを押してみてください。

今回、一番下の「abc02」の横の削除ボタンを押してみました。

「abc02」が削除されました!

削除する機能はほぼすべてのシステムで存在しているといっても過言ではありません。

実際に触ってみて実装方法を覚えておきましょう

今回のファイルのまとめ

今回は3つのファイルを使用しました。

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

// 2023.02.18 追記
Route::get('/hello', 'App\Http\Controllers\HelloController@index');

// 2023.03.11 追記
Route::get('/register_manager', 'App\Http\Controllers\ManagerController@index');
Route::post('/register_manager', 'App\Http\Controllers\ManagerController@register');

// 2023.03.25 追記
Route::get('/list_manager', 'App\Http\Controllers\ManagerController@list');

// 2023.04.01 追記
Route::DELETE('/list_manager', 'App\Http\Controllers\ManagerController@delete');

さいごに

今回は「Laravel」の入門編7として、データベースのテーブルに登録したレコードを物理削除する方法を解説しました。

何度も言いますが、削除機能は、ほぼすべてのシステムで存在しているといっても過言ではありません。
実際に触ってみて実装方法を覚えておきましょう!

注意すべき点がわかっていれば簡単に実装を行えるようになります。

ぜひこの記事を参考に、システムを作ってみてくださいね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次