Laravel Soft Delete

Laravel Soft Delete

1. Giới thiệu

  • Việc xoá dữ liệu thì có 2 trường phái là: xoá và ẩn đi trong mỗi query. vậy 2 cách này có ưu điểm và nhược điểm gì ? chúng ta hãy đến với từng phần để hiểu rõ hơn nha.

2.Xóa cứng

  • Việc xoá cứng diễn ra rất bình thường tức nghĩa là xoá đi 1 record trong table, và sẽ không phục hồi lại được (trừ khi có backup database)
  • Việc này mang lại lợi ích là giải phóng không gian lưu trữ, nhưng có 1 bất lợi rất lớn là không thể phục hồi. Nên sau này người ta rất hạn chế sử dụng hard delete mà thay vào đó sẽ chuyển sang cơ chế ẩn đi thay vì xoá cứng.

3.Xóa mềm (Soft delete)

  • Không giống như xoá cứng, việc xoá mềm chỉ đơn giản là ẩn đi 1 record trong 1 câu truy vấn
  • Việc sử dụng softDeletes trong laravel clear hơn rất nhiều so với dùng cách thông thường ở trên về cơ chế là giống nhau nhưng laravel đã hỗ trợ để ta có thể select bình thường mà không cần dùng tới where is_disabled = 0 . Nếu select lúc nào cũng where thêm điều kiện này thì thật hơi phiền đúng k nào, chúng ta hãy cùng config softDeletes trong laravel nhé.

4.Cài đặt

  • Cài đặt project: $ composer create-project laravel/laravel softdelete
  • Setup cơ sở dữ liệu
    file .env trong project thiết lập các thông tin để kết nối đến csdl của bạn
  • Tạo table posts: php artisan make:migration create_posts_table
  • Thêm  $table->softDeletes() phương thức xóa mềm của laravel.
  • Sau đó ta chạy câu lệnh: php artisan migrate để tạo table trong database
 DB_CONNECTION=mysql 
 DB_HOST=127.0.0.1 
 DB_PORT=3306 
 DB_DATABASE=databasename
 DB_USERNAME=username
 DB_PASSWORD=password
<?php

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

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->string('depscription');
            $table->text('content');
            $table->softDeletes(); // Xóa mềm
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}
  • Tạo model cho table post
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class PostModel extends Model
{
    use HasFactory, SoftDeletes;

    protected $table = 'posts';
}

5.Sử dụng Soft Delete:

  • Xoá record: PostModel::where('id', 1)->delete(); => Khi ta gọi method delete cho posts có id bằng 1 thì ở tại record này sẽ update cột deleted_at với giá trị khác null ( khi xoá sẽ cập nhật thời gian )
  • Get dữ liệu : PostModel::all(); sẽ lấy ra tất cả record trong bảng posts không bao gồm record có deleted_at khác null. Rất clear đúng không nào.
  • để lấy tất cả record bao gồm cả record đã xoá bằng softDeletes : PostModel::withTrashed()->get();
  • Để lấy ra chỉ các record đã xoá : PostModel::onlyTrashed()->get();
  • Để lấy lại record đã xoá bằng softDeletes: PostModel::withTrashed()->where('id', 1)->restore();
  • Xoá record vĩnh viễn: PostModel::withTrashed()->where('id', 1)->forceDelete();

6.Kết Luận

Việc áp dụng softDeletes sẽ rất an toàn cho việc restore lại dữ liệu đã xoá. Cách áp dụng vào thiết kế database cũng rất đơn giản, nếu dùng laravel framework thì đã được hỗ trợ sẵn rồi nên việc sử dụng càng thuận tiện hơn.