Mysql
 sql >> Base de données >  >> RDS >> Mysql

Tutoriel complet sur la suppression et la restauration des enregistrements supprimés de Laravel 8

Publié à l'origine @ https://codeanddeploy.com, visitez et téléchargez l'exemple de code :
https://codeanddeploy.com/blog/laravel/complete-laravel-8-soft-delete-restore-deleted-records-tutorial

Dans cet article, je partagerai avec vous une procédure complète de suppression logicielle Laravel 8 et de restauration des enregistrements supprimés Didacticiel. Lors du développement d'opérations CRUD dans Laravel, nous devons parfois implémenter des suppressions logicielles. Ainsi, si nous supprimons par erreur l'enregistrement spécifique, nous pouvons facilement le restaurer. C'est pourquoi cela est important et doit exister dans notre application Laravel.

Dans cet article, vous apprendrez une mise en œuvre complète avec la suppression logicielle Laravel et comment restaurer les enregistrements supprimés avec un exemple.

 Étape 1 :Installation de Laravel

Si vous n'avez pas d'installation de Laravel 8 dans votre local, exécutez simplement la commande suivante ci-dessous :

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

Une fois fait ci-dessus, nous devons installer le paquet collectif Laravel, exécutez la commande suivante ci-dessous :

composer require laravelcollective/html

 Étape 2 :Configuration de la base de données

Si votre projet Laravel est frais, vous devez mettre à jour les informations d'identification de votre base de données. Ouvrez simplement le fichier .env dans votre projet Laravel 8.

.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

 Étape 3 :Configuration de la migration

Créons une migration pour notre **laravel soft delete **exemple de projet. Dans cet exemple, nous utilisons la table de l'utilisateur dont la migration existe déjà dans l'installation de Laravel. Nous avons donc juste besoin de modifier cette migration. Voir ci-dessous le code de mise à jour :

<?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');
    }
}

Comme vous pouvez le voir, nous avons ajouté le $table->softDeletes(); méthode pour implémenter la suppression logicielle laravel.

Exécutons maintenant la commande suivante ci-dessous :

php artisan migrate

 Étape 4 :Configurer des itinéraires

Dans mon exemple, je vais créer manuellement mes crud routes. Ouvrez simplement le "routes/web.php" fichier et ajoutez les routes suivantes.

<?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');
    });
});

Comme vous pouvez le voir, nous avons ajouté des routes de restauration, de suppression forcée et de restauration complète. Vous verrez notre code de contrôleur pour ces itinéraires.

 Étape 5 :Configurer le modèle pour notre suppression logicielle

Comme vous pouvez le voir ci-dessous, nous avons importé l'utilisation Illuminate\Database\Eloquent\SoftDeletes; class et utilisez-le dans notre modèle User.

<?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);
    }
}

Étape 6 :Laravel Soft Delete &Restore Méthodes de contrôleur des enregistrements supprimés

Méthode d'indexation dans UserController.php comme vous pouvez le voir, j'ai vérifié s'il existe un statut avec la valeur archivée de la requête et j'ai appelé la méthode $users->onlyTrashed() afin que seuls les suppressions logicielles soient affichées sur les listes.

/**
 * 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'));
}

Dans cette méthode à l'intérieur de UserController.php j'ai appelé le withTrashed() et restaurer() méthodes cela nous permettra de restaurer l'enregistrement supprimé.

/**
 *  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.'));
}

Il s'agit de l'implémentation de la suppression forcée de l'enregistrement supprimé à l'aide de forceDelete() méthode.

/**
 * 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.'));
}

Dans cette action, nous avons appelé le onlyTrashed() et restaurer() méthodes afin que nous puissions tous restaurer les enregistrements qui sont supprimés.

/**
 * 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.'));
}

Étape 7 :Contrôleur utilisateur Laravel Soft Delete

Vous trouverez ci-dessous le code complet de notre UserController.php avec les implémentations de Laravel 8 soft delete et de restauration des enregistrements supprimés.

<?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.'));
    }
}

 Étape 8 :Affichage de la lame d'indexation

Code ci-dessous à propos de notre index.blade.php dans lequel nous codons les implémentations de suppression logicielle Laravel.

@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

Vous avez maintenant les implémentations complètes pour la suppression logicielle Laravel, y compris la restauration des enregistrements supprimés.

J'espère que ce tutoriel pourra vous aider. Veuillez visiter ici https://codeanddeploy.com/blog/laravel/complete-laravel-8-soft-delete-restore-deleted-records-tutorial si vous souhaitez télécharger ce code.

Bon codage :)