ユーザーの論理削除(ソフトデリート)の実装手順

# はじめに
論理削除(ソフトデリート)の実装手順をメモします。

- バージョン
  php: 7.2
  laravel: 5.8
- Authは実装済みでユーザーも登録済みであること

# usersテーブルにdelete_atカラムを追加
下記コマンドでカラム追加用のマイグレーションファイルを作成する。

```
$ php artisan make:migration add_column_softDeletes_users_table --table=users
```

マイグレーションファイルを下記のように編集する。
up関数とdown関数に下記を追記する。

```
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddColumnSoftDeletesUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            //下記を追加
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            //下記を追加
            $table->dropColumn('deleted_at');
        });
    }
}
```

up関数に
$table->softDeletes();
を追加すると、deleted_atカラムをusersテーブルに追加できます。
このdeleted_atカラムにおいて論理削除のON/OFFを切り替えます。

下記コマンドにてup関数を実行します。

```
$ php artisan migrate
```

usersテーブルのカラム構成を確認する。
確認方法は下記投稿に書いてあります。
[LaravelのMYSQLのコマンド一覧【随時更新予定】](https://qiita.com/syokichi09/items/e7bf4397a1374c6b2683)

```
+-------------------+---------------------+------+-----+---------+----------------+
| Field             | Type                | Null | Key | Default | Extra          |
+-------------------+---------------------+------+-----+---------+----------------+
| id                | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| name              | varchar(255)        | NO   |     | NULL    |                |
| email             | varchar(191)        | NO   | UNI | NULL    |                |
| email_verified_at | timestamp           | YES  |     | NULL    |                |
| password          | varchar(255)        | NO   |     | NULL    |                |
| remember_token    | varchar(100)        | YES  |     | NULL    |                |
| created_at        | timestamp           | YES  |     | NULL    |                |
| updated_at        | timestamp           | YES  |     | NULL    |                |
| deleted_at        | timestamp           | YES  |     | NULL    |                |
+-------------------+---------------------+------+-----+---------+----------------+
```
Fieldの一番下に「deleted_at」が確認できます。

# Userモデルの編集
ModelクラスとSoftDeletesクラスを利用できるように設定します。

```php:User.php
<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

//追記
use Illuminate\Database\Eloquent\Model;
//追記
use Illuminate\Database\Eloquent\SoftDeletes;


class User extends Authenticatable
{
    use Notifiable;

    //追記
    use SoftDeletes;


    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}
```



# Controllerの実装
AuthクラスとUserクラスを利用できるように設定してsoftdeleteアクションを追加します。
リダイレクト先にURL(news/index)を設定します。

```php:UserController.php
<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
//追記
use Illuminate\Support\Facades\Auth;
//追記
use App\User;

class UserController extends Controller
{
    //追記
    public function softdelete()
    {
        User::find(Auth::id())->delete();
        //リダイレクト先の設定
        return redirect('news/index');
    }
}
```

# Viewの実装
論理削除ボタンを作ります。

```php:user/index.blade.php
<a href="{{ action('Admin\UserController@softdelete') }}">
    <button>論理削除</button>
</a>
```

ボタンは下記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580653/af469679-d7bd-7027-7f8e-fcc7128f504f.png)

# Routingの設定

```php:web.php
<?php
namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
//追記
use Illuminate\Support\Facades\Auth;
//追記
use App\User;

class UserController extends Controller
{

Route::group(['middleware' => 'auth:user'], function()
{ 
    //追記
    Route::get('user/softdelete', 'Admin\UserController@softdelete');
});
}
```
これで実装は完了です。
論理削除ボタンを押せばログイン中のユーザーが論理削除されます。
usersテーブル内のデータを確認すればdeleted_atカラムがNULLから日付に変更されているはずです。
例えば下記テーブルで見ると、name2とname3が論理削除されています。

```
mysql> select id, name, deleted_at from users;                                                                                                                                                                                                  
+----+----------+---------------------+
| id | name  | deleted_at          |
+----+----------+---------------------+
|  1 | name1 | NULL                |
|  2 | name2 | 2020-02-29 02:01:49 |
|  3 | name3 | 2020-02-29 01:56:39 |
+----+----------+---------------------+
```

# 参考

- [Laravelの認証機能でユーザ情報の論理削除（ソフトデリート）を実装する](https://www.ritolab.com/entry/53)