Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Hoàn thành Hướng dẫn xóa mềm &khôi phục bản ghi đã xóa của Laravel 8

Ban đầu được đăng @ https://codeanddeploy.com hãy truy cập và tải xuống mã mẫu:
https://codeanddeploy.com/blog/laravel/complete-laravel-8-soft-delete-restore-deleted-records-tutorial

Trong bài đăng này, tôi sẽ chia sẻ với bạn toàn bộ Xóa mềm Laravel 8 và khôi phục các bản ghi đã xóa hướng dẫn. Khi phát triển các hoạt động CRUD trong Laravel, đôi khi chúng ta cần thực hiện các thao tác xóa mềm. Vì vậy, nếu chúng tôi xóa không chính xác bản ghi cụ thể, chúng tôi có thể dễ dàng khôi phục chúng. Đó là lý do tại sao điều này quan trọng và phải tồn tại trong ứng dụng Laravel của chúng tôi.

Trong bài viết này, bạn sẽ học cách triển khai đầy đủ với xóa mềm Laravel và cách khôi phục các bản ghi đã xóa với ví dụ.

Bước 1:Cài đặt Laravel

Nếu bạn không có bản cài đặt Laravel 8 trong cục bộ của mình, chỉ cần chạy lệnh sau:

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

Sau khi thực hiện xong ở trên, chúng ta cần cài đặt Gói Laravel Collective, chạy lệnh sau:

composer require laravelcollective/html

Bước 2:Cấu hình cơ sở dữ liệu

Nếu Dự án Laravel của bạn là mới thì bạn cần cập nhật thông tin đăng nhập cơ sở dữ liệu của mình. Chỉ cần mở tệp .env trong dự án Laravel 8 của bạn.

.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

Bước 3:Thiết lập Di chuyển

Hãy tạo một chuyển đổi cho dự án ví dụ ** laravel soft delete ** của chúng ta. Trong ví dụ này, chúng tôi đang sử dụng bảng của người dùng mà quá trình di chuyển đã tồn tại trong cài đặt Laravel. Vì vậy, chúng tôi chỉ cần chỉnh sửa việc di chuyển đó. Xem mã cập nhật bên dưới:

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

Như bạn có thể thấy, chúng tôi đã thêm $ table-> softDeletes (); để thực hiện xóa mềm laravel.

Bây giờ hãy chạy lệnh sau:

php artisan migrate

Bước 4:Thiết lập các tuyến

Trong ví dụ của tôi, tôi sẽ tạo các tuyến đường thô của mình theo cách thủ công. Chỉ cần mở "route / web.php" tập tin và thêm các tuyến đường sau đây.

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

Như bạn có thể thấy, chúng tôi đã thêm các tuyến khôi phục, xóa buộc và khôi phục tất cả. Bạn sẽ thấy mã bộ điều khiển của chúng tôi cho các tuyến đường này.

Bước 5:Thiết lập Mô hình cho Xóa mềm của chúng tôi

Như bạn có thể thấy bên dưới, chúng tôi đã nhập sử dụng Illuminate \ Database \ Eloquent \ SoftDeletes; và sử dụng nó trong mô hình Người dùng của chúng tôi.

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

Bước 6:Laravel Soft Delete &Restore Các phương pháp bộ điều khiển bản ghi đã xóa

Phương thức lập chỉ mục bên trong UserController.php như bạn có thể thấy. Tôi đã kiểm tra xem có trạng thái với giá trị được lưu trữ từ yêu cầu hay không và gọi phương thức $ users-> onlyTrashed () để chỉ những phần mềm đã xóa mới được hiển thị trên danh sách.

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

Trong phương thức này bên trong UserController.php, tôi đã gọi withTrashed () khôi phục () phương pháp này sẽ cho phép chúng tôi khôi phục bản ghi đã xóa.

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

Đây là việc triển khai buộc xóa bản ghi đã chuyển vào thùng rác bằng cách sử dụng forceDelete () phương pháp.

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

Trong hành động này, chúng tôi gọi là onlyTrashed () khôi phục () để tất cả chúng ta sẽ khôi phục các bản ghi được chuyển vào thùng rác.

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

Bước 7:Laravel Soft Delete User Controller

Dưới đây là mã hoàn chỉnh cho UserController.php của chúng tôi với các triển khai của xóa mềm Laravel 8 và khôi phục các bản ghi đã xóa.

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

Bước 8:Chế độ xem Lưỡi dao lập chỉ mục

Mã dưới đây về index.blade.php của chúng tôi mà chúng tôi viết mã cho các triển khai xóa mềm 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

Bây giờ bạn có các triển khai hoàn chỉnh cho xóa mềm Laravel bao gồm khôi phục các bản ghi đã xóa.

Tôi hy vọng hướng dẫn này có thể giúp bạn. Vui lòng truy cập vào đây https://codeanddeploy.com/blog/laravel/complete-laravel-8-soft-delete-restore-deleted-records-tutorial nếu bạn muốn tải xuống mã này.

Chúc bạn viết mã vui vẻ :)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tôi có thể tìm kiếm (không phân biệt chữ hoa chữ thường) trong một cột bằng cách sử dụng ký tự đại diện LIKE?

  2. Kiểm tra xem bảng MySQL có tồn tại mà không sử dụng cú pháp select from hay không?

  3. mysql_num_rows ():đối số được cung cấp không phải là tài nguyên kết quả MySQL hợp lệ

  4. PDO ::fetchAll so với PDO ::tìm nạp trong một vòng lặp

  5. Neo4j - Chọn dữ liệu với MATCH bằng Cypher