見出し画像

ユーザー管理機能で忘れていたのがあったので、実装してみました。大会については論理削除と物理削除みたいなのが出てきてナニソレ状態でしたが、復元機能までいけました。

備忘録的に書いていきます。最後の方に見つけた課題にも書いているので、お分かりになる方は教えて頂きたいです🙇‍♂️

やること

論理削除と復元処理。(復元についてはこちらの記事に書いてあります)

論理削除の際にユーザーに紐づいているデータも一緒に消すこと。これは論理削除実装してから書きます。

この辺りです。

論理削除

『削除した』扱いにする。復活出来る。レコードは存在する。

物理削除

『削除する』。復活出来ない。レコードは存在しない。

イメージはこんな感じです。今回は論理削除で進めていきます。

前提

ユーザーの管理機能はだいたい実装出来ている。以前書いた記事です。これよりは浅く行けると思います。

大まかな流れ

マイグレーションファイル作成

モデルファイルに記載追加

ルーティング記載追加

コントローラー記載追加

ビュー画面ボタン追加

論理削除出来るか確認。

ユーザーに紐づくテーブルも論理削除するように設定

インストール

モデルファイル記載追加

って感じで進めていきます。

マイグレーションファイルに作成

ファイル作成しなくても実装出来ますが、コマンドでファイル作ります。

php artisan make:migration add_column_softDeletes_users_table --table=users
<?php

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

class SoftdeleteUsersTable extends Migration
{
   /**
    * Run the migrations.
    *
    * @return void
    */
   public function up()
   {
       Schema::table('users', function (Blueprint $table) {
1          $table->softDeletes();
       });
   }

   /**
    * Reverse the migrations.
    *
    * @return void
    */
   public function down()
   {
       Schema::table('users', function (Blueprint $table) {
2          $table->dropColumn('deleted_at');
       });
   }
}
php artisan migrate
もしくは
php artisan migrate:fresh

1,  softDeletes()メソッドが論理削除にしています。

2,  削除されたときにdeleted_atカラムが追加されるような形にする。

ユーザーテーブルにカラムを追加するファイルです。わざわざ作成しなくても、元からあるファイルに記載すれば問題ないです。

モデルファイルに記載追加

論理削除に関する記載を書いていきます。

use Illuminate\Database\Eloquent\SoftDeletes;   

class User extends Authenticatable
{
   use MustVerifyEmail, Notifiable, SoftDeletes;
   
   protected $dates = ['deleted_at'];   1

省略

1,  カラムの追加を許可しています。

SoftDeletesも使用できるようにしています。

ルーティング記載追加

削除アクションのパスを用意します。

Route::post('/user/{user}/delete', 'UserController@softdeleteUser')->name('user_delete');

コントローラー記載追加

public function softdeleteUser(User $user) 
{
1  if(Auth::check() && Auth::id() == $user->id ) {
2      $user->delete();
       return redirect()->route('home')->with('say', '退会処理が完了しました');
   } else {
3      return redirect()->route('my_page', ['user' => Auth::id()])->with('say', '何らかの理由で退会処理が出来ませんでした、取引中の商品などを確認してください。');
   }
   
}

1,  ログイン状態にあるかとユーザーが一致しているかをチェックしています。

2,  論理削除が働きます。

3,  削除出来なかった場合はマイページに戻します。

ビュー画面ボタン追加

上下は省略しています。

@if(session('say'))   1
	<div class="alert alert-success" role="alert">
			{{ session('say') }}
	</div>
@endif

@if(Auth::check() && Auth::id() == $user->id)    2
	<form method="post" action="{{ route('user_delete', ['user' => Auth::id()]) }}">
		{{ csrf_field() }}
		<input type="submit" value="退会" class="dropdown-item text-center" onclick='return confirm("本当に退会しますか?");'>
	</form>
@endif

1,  セッションの中に値が入っていた時は表示させます。

2,  ログイン状態にあるかとユーザーが一致しているかをチェックしています。

ここまで出来たら、退会処理を確認してみましょう!退会した後にデータベースのレコードのdeleted_atの中に値が入っていれば論理削除成功です。

うまくいくことが確認できれば、次はユーザーに紐づいているテーブルについても論理削除出来るように実装していきます。

インストール

laravel-soft-cascadeをコンポーザーでインストールします。

composer require askedio/laravel-soft-cascade

モデルファイル記載追加

ユーザーモデルに記載を追加します。

use \Askedio\SoftCascade\Traits\SoftCascadeTrait;

protected $softCascade = ['profiles'];  1

1, profilesの部分はリレーション関係にあるテーブル名を記載して行きます。

上記まで記載出来たら、紐づいたデータも論理削除されるか確認して行きましょう!リレーション先も論理削除にするならマイグレーションファイルに記載追加でいけると思います。ただ、それするとレコードめっちゃ増えそう。。

課題

laravel-soft-cascadeを使って紐づいてるテーブルを削除するときに、テーブルの数が多すぎると削除出来ません。泣

なんでかわからないんですけど、エラーになってしまいます。

Maximum execution time of 60 seconds exceeded

時間切れって表示されてるんで、処理重すぎてメモリ不足系なんだろうと思い、php.iniでマックス-1にしてみたんですけど、うまくいかずでした。誰か〜助けて〜って感じです。

まとめ

論理削除と物理削除の違いが曖昧なとこからだったので、良い勉強になりました。

laravel-soft-cascadeを使用すればリレーション先も削除出来ますね。論理削除の場合はマイグレーションファイルの記載変更でいけます。

今回はそんな感じで!

以上!

参考にしたサイト

論理削除

リレーション先