sql >> データベース >  >> RDS >> Mysql

Laravel8のソフト削除と削除済みレコードの復元のチュートリアルを完了する

    最初に投稿された@https://codeanddeploy.comにアクセスして、サンプルコードをダウンロードします。
    https://codeanddeploy.com/blog/laravel/complete-laravel-8-soft-delete-restore-deleted-records-tutorial

    この投稿では、完全なLaravel8ソフト削除および削除されたレコードの復元を共有します チュートリアル。 LaravelでCRUD操作を開発する場合、ソフト削除を実装する必要がある場合があります。そのため、特定のレコードを誤って削除した場合でも、簡単に復元できます。そのため、これは重要であり、Laravelアプリケーションに存在する必要があります。

    この記事では、Laravelソフト削除を使用した完全な実装と、削除されたレコードを例を使用して復元する方法を学習します。

    ステップ1:Laravelのインストール

    ローカルにLaravel8がインストールされていない場合は、以下のコマンドを実行してください。

    composer create-project --prefer-dist laravel/laravel laravel-soft-delete
    

    上記の作業が完了したら、 LaravelCollectivePackageをインストールする必要があります 以下のコマンドを実行します。

    composer require laravelcollective/html
    

    ステップ2:データベース構成

    Laravelプロジェクトの場合 が新鮮な場合は、データベースのクレデンシャルを更新する必要があります。 Laravel8プロジェクトで.envファイルを開くだけです。

    .env

    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=your_database_name_here
    DB_USERNAME=your_database_username_here
    DB_PASSWORD=your_database_password_here
    

    ステップ3:移行の設定

    **laravelソフト削除**サンプルプロジェクトの移行を作成しましょう。この例では、移行がLaravelインストールにすでに存在するユーザーのテーブルを使用しています。したがって、その移行を編集する必要があります。以下の更新コードを参照してください。

    <?php
    
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    class CreateUsersTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('users', function (Blueprint $table) {
                $table->id();
                $table->string('name')->nullable();
                $table->string('email')->unique();
                $table->string('username')->unique();
                $table->timestamp('email_verified_at')->nullable();
                $table->string('password');
                $table->softDeletes();
                $table->rememberToken();
                $table->timestamps();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('users');
        }
    }
    

    ご覧のとおり、 $ table-> softDeletes();を追加しました Laravelのソフト削除を実装する方法。

    次に、以下のコマンドを実行してみましょう。

    php artisan migrate
    

    ステップ4:ルートを設定する

    私の例では、クラッドルートを手動で作成します。 "routes / web.php"を開くだけです ファイルを作成し、次のルートを追加します。

    <?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::group(['namespace' => 'App\Http\Controllers'], function()
    {   
        /**
         * Home Routes
         */
        Route::get('/', 'HomeController@index')->name('home.index');
    
        Route::group(['prefix' => 'users'], function() {
            Route::get('/', 'UsersController@index')->name('users.index');
            Route::get('/create', 'UsersController@create')->name('users.create');
            Route::post('/create', 'UsersController@store')->name('users.store');
            Route::get('/{user}/show', 'UsersController@show')->name('users.show');
            Route::get('/{user}/edit', 'UsersController@edit')->name('users.edit');
            Route::patch('/{user}/update', 'UsersController@update')->name('users.update');
            Route::delete('/{user}/delete', 'UsersController@destroy')->name('users.destroy');
            Route::post('/{user}/restore', 'UsersController@restore')->name('users.restore');
            Route::delete('/{user}/force-delete', 'UsersController@forceDelete')->name('users.force-delete');
            Route::post('/restore-all', 'UsersController@restoreAll')->name('users.restore-all');
        });
    });
    

    ご覧のとおり、restore、force-delete、restore-allルートを追加しました。これらのルートのコントローラーコードが表示されます。

    ステップ5:ソフト削除用のモデルの設定

    以下に示すように、Illuminate \ Database \ Eloquent\SoftDeletesを使用してインポートしました。クラスを作成し、ユーザーモデルで使用します。

    <?php
    
    namespace App\Models;
    
    use Illuminate\Contracts\Auth\MustVerifyEmail;
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Illuminate\Notifications\Notifiable;
    use Laravel\Sanctum\HasApiTokens;
    use Illuminate\Database\Eloquent\SoftDeletes;
    
    
    class User extends Authenticatable
    {
        use HasApiTokens, HasFactory, Notifiable, SoftDeletes;
    
        /**
         * The database table used by the model.
         *
         * @var string
         */
        protected $table = 'users';
    
        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = [
            'name',
            'email',
            'username',
            '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',
        ];
    
        /**
         * The attributes that should be mutated to dates.
         *
         * @var array
         */
        protected $dates = ['deleted_at'];
    
        /**
         * Always encrypt password when it is updated.
         *
         * @param $value
         * @return string
         */
        public function setPasswordAttribute($value)
        {
            $this->attributes['password'] = bcrypt($value);
        }
    }
    

    ステップ6:Laravel Soft Delete&Restore DeletedRecordsControllerメソッド

    ご覧のとおり、UserController.php内のインデックスメソッドは、リクエストからのアーカイブ値のステータスがあるかどうかを確認し、メソッド $ users-> onlyTrashed()を呼び出します。 ソフト削除のみがリストに表示されるようにします。

    /**
     * Display all users
     * 
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request) 
    {
        $users = User::latest();
    
        if($request->get('status') == 'archived') {
            $users = $users->onlyTrashed();
        }
    
        $users = $users->paginate(10);
    
        return view('users.index', compact('users'));
    }
    

    UserController.php内のこのメソッドでは、 withTrashed()を呼び出しました。 およびrestore() これにより、削除されたレコードを復元できるようになります。

    /**
     *  Restore user data
     * 
     * @param User $user
     * 
     * @return \Illuminate\Http\Response
     */
    public function restore($id) 
    {
        User::where('id', $id)->withTrashed()->restore();
    
        return redirect()->route('users.index', ['status' => 'archived'])
            ->withSuccess(__('User restored successfully.'));
    }
    
    

    これは、 forceDelete()を使用してゴミ箱に移動されたレコードを強制的に削除する実装です。 方法。

    /**
     * Force delete user data
     * 
     * @param User $user
     * 
     * @return \Illuminate\Http\Response
     */
    public function forceDelete($id) 
    {
        User::where('id', $id)->withTrashed()->forceDelete();
    
        return redirect()->route('users.index', ['status' => 'archived'])
            ->withSuccess(__('User force deleted successfully.'));
    }
    

    このアクションでは、 onlyTrashed()を呼び出しました およびrestore() ゴミ箱に捨てられたレコードをすべて復元するためのメソッド。

    /**
     * Restore all archived users
     * 
     * @param User $user
     * 
     * @return \Illuminate\Http\Response
     */
    public function restoreAll() 
    {
        User::onlyTrashed()->restore();
    
        return redirect()->route('users.index')->withSuccess(__('All users restored successfully.'));
    }
    

    ステップ7:LaravelSoftDeleteユーザーコントローラー

    以下は、Laravel8のソフト削除と削除されたレコードの復元を実装したUserController.phpの完全なコードです。

    <?php
    
    namespace App\Http\Controllers;
    
    use App\Models\User;
    use Illuminate\Http\Request;
    use App\Http\Requests\StoreUserRequest;
    use App\Http\Requests\UpdateUserRequest;
    
    class UsersController extends Controller
    {
        /**
         * Display all users
         * 
         * @return \Illuminate\Http\Response
         */
        public function index(Request $request) 
        {
            $users = User::latest();
    
            if($request->get('status') == 'archived') {
                $users = $users->onlyTrashed();
            }
    
            $users = $users->paginate(10);
    
            return view('users.index', compact('users'));
        }
    
        /**
         * Show form for creating user
         * 
         * @return \Illuminate\Http\Response
         */
        public function create() 
        {
            return view('users.create');
        }
    
        /**
         * Store a newly created user
         * 
         * @param User $user
         * @param StoreUserRequest $request
         * 
         * @return \Illuminate\Http\Response
         */
        public function store(User $user, StoreUserRequest $request) 
        {
            //For demo purposes only. When creating user or inviting a user
            // you should create a generated random password and email it to the user
            $user->create(array_merge($request->validated(), [
                'password' => 'test' 
            ]));
    
            return redirect()->route('users.index')
                ->withSuccess(__('User created successfully.'));
        }
    
        /**
         * Show user data
         * 
         * @param User $user
         * 
         * @return \Illuminate\Http\Response
         */
        public function show(User $user) 
        {
            return view('users.show', [
                'user' => $user
            ]);
        }
    
        /**
         * Edit user data
         * 
         * @param User $user
         * 
         * @return \Illuminate\Http\Response
         */
        public function edit(User $user) 
        {
            return view('users.edit', [
                'user' => $user
            ]);
        }
    
        /**
         * Update user data
         * 
         * @param User $user
         * @param UpdateUserRequest $request
         * 
         * @return \Illuminate\Http\Response
         */
        public function update(User $user, UpdateUserRequest $request) 
        {
            $user->update($request->validated());
    
            return redirect()->route('users.index')
                ->withSuccess(__('User updated successfully.'));
        }
    
        /**
         * Delete user data
         * 
         * @param User $user
         * 
         * @return \Illuminate\Http\Response
         */
        public function destroy(User $user) 
        {
            $user->delete();
    
            return redirect()->route('users.index')
                ->withSuccess(__('User deleted successfully.'));
        }
    
        /**
         *  Restore user data
         * 
         * @param User $user
         * 
         * @return \Illuminate\Http\Response
         */
        public function restore($id) 
        {
            User::where('id', $id)->withTrashed()->restore();
    
            return redirect()->route('users.index', ['status' => 'archived'])
                ->withSuccess(__('User restored successfully.'));
        }
    
        /**
         * Force delete user data
         * 
         * @param User $user
         * 
         * @return \Illuminate\Http\Response
         */
        public function forceDelete($id) 
        {
            User::where('id', $id)->withTrashed()->forceDelete();
    
            return redirect()->route('users.index', ['status' => 'archived'])
                ->withSuccess(__('User force deleted successfully.'));
        }
    
        /**
         * Restore all archived users
         * 
         * @param User $user
         * 
         * @return \Illuminate\Http\Response
         */
        public function restoreAll() 
        {
            User::onlyTrashed()->restore();
    
            return redirect()->route('users.index')->withSuccess(__('All users restored successfully.'));
        }
    }
    

    ステップ8:インデックスブレードビュー

    Laravelソフト削除の実装をコーディングするindex.blade.phpについて以下のコードを記述します。

    @extends('layouts.app-master')
    
    @section('content')
    
        <h1 class="mb-3">Laravel Soft Delete Example - codeanddeploy.com</h1>
    
        <div class="bg-light p-4 rounded">
            <h1>Users</h1>
            <div class="lead">
                Manage your users here.
                <a href="{{ route('users.create') }}" class="btn btn-primary btn-sm float-right">Add new user</a>
            </div>
    
            <div class="mt-2">
                @include('layouts.partials.messages')
    
                <br>
                <a href="/users">All users</a> | <a href="/users?status=archived">Archived users</a>
    
                <br><br>
                @if(request()->get('status') == 'archived')
                    {!! Form::open(['method' => 'POST','route' => ['users.restore-all'],'style'=>'display:inline']) !!}
                    {!! Form::submit('Restore All', ['class' => 'btn btn-primary btn-sm']) !!}
                    {!! Form::close() !!}
                @endif
            </div>
    
            <table class="table table-striped">
                <thead>
                <tr>
                    <th scope="col" width="1%">#</th>
                    <th scope="col" width="15%">Name</th>
                    <th scope="col">Email</th>
                    <th scope="col" width="10%">Username</th>
                    <th scope="col" width="1%" colspan="4"></th>    
                </tr>
                </thead>
                <tbody>
                    @foreach($users as $user)
                        <tr>
                            <th scope="row">{{ $user->id }}</th>
                            <td>{{ $user->name }}</td>
                            <td>{{ $user->email }}</td>
                            <td>{{ $user->username }}</td>
                            <td><a href="{{ route('users.show', $user->id) }}" class="btn btn-warning btn-sm">Show</a></td>
                            <td><a href="{{ route('users.edit', $user->id) }}" class="btn btn-info btn-sm">Edit</a></td>
                            <td>
                                @if(request()->get('status') == 'archived')
                                    {!! Form::open(['method' => 'POST','route' => ['users.restore', $user->id],'style'=>'display:inline']) !!}
                                    {!! Form::submit('Restore', ['class' => 'btn btn-primary btn-sm']) !!}
                                    {!! Form::close() !!}
                                @else
                                    {!! Form::open(['method' => 'DELETE','route' => ['users.destroy', $user->id],'style'=>'display:inline']) !!}
                                    {!! Form::submit('Delete', ['class' => 'btn btn-danger btn-sm']) !!}
                                    {!! Form::close() !!}
                                @endif
                            </td>
                            <td>
                                @if(request()->get('status') == 'archived')
                                    {!! Form::open(['method' => 'DELETE','route' => ['users.force-delete', $user->id],'style'=>'display:inline']) !!}
                                    {!! Form::submit('Force Delete', ['class' => 'btn btn-danger btn-sm']) !!}
                                    {!! Form::close() !!}
                                @endif
                            </td>
                        </tr>
                    @endforeach
                </tbody>
            </table>
    
            <div class="d-flex">
                {!! $users->links() !!}
            </div>
    
        </div>
    @endsection
    

    これで、削除されたレコードの復元を含む、Laravelソフト削除の完全な実装ができました。

    このチュートリアルがお役に立てば幸いです。このコードをダウンロードする場合は、https://codeanddeploy.com/blog/laravel/complete-laravel-8-soft-delete-restore-deleted-records-tutorialにアクセスしてください。

    ハッピーコーディング:)


    1. mysqlにはOracleの分析関数と同等のものがありますか?

    2. テーブルが存在する場合、それを削除するにはどうすればよいですか?

    3. 別の表領域を使用してクエリから表を作成する(Oracle SQL)

    4. SQLServerの既存の列にデフォルトの制約を追加する方法