Xóa mềm (soft delete) là một kỹ thuật trong Laravel cho phép bạn đánh dấu một bản ghi trong cơ sở dữ liệu là “đã xóa” mà không thực sự xóa nó. Điều này rất hữu ích khi bạn muốn giữ lại dữ liệu để có thể phục hồi sau này hoặc để thực hiện các phân tích dữ liệu mà không cần mất thông tin. Laravel hỗ trợ xóa mềm thông qua tính năng SoftDeletes. Bài viết này sẽ hướng dẫn bạn cách thực hiện xóa mềm trong Laravel.

Bước 1: Cài đặt SoftDeletes trong Model

Trước tiên, bạn cần thêm tính năng SoftDeletes vào model mà bạn muốn thực hiện xóa mềm. Giả sử bạn có một model tên là Post.

1.1. Sử dụng use SoftDeletes

Mở tệp Post.php trong thư mục app/Models và thêm trait SoftDeletes vào model:

namespace AppModels;

use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;

class Post extends Model
{
    use SoftDeletes;

    // Các thuộc tính và phương thức khác của model
}

1.2. Thêm cột deleted_at vào bảng

Để thực hiện xóa mềm, bạn cần có một cột deleted_at trong bảng của model. Bạn có thể tạo migration để thêm cột này vào bảng. Chạy lệnh sau để tạo migration mới:

php artisan make:migration add_deleted_at_to_posts_table --table=posts

Mở tệp migration mới được tạo trong thư mục database/migrations và thêm cột deleted_at:

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class AddDeletedAtToPostsTable extends Migration
{
    public function up()
    {
        Schema::table('posts', function (Blueprint $table) {
            $table->softDeletes(); // Thêm cột deleted_at
        });
    }

    public function down()
    {
        Schema::table('posts', function (Blueprint $table) {
            $table->dropSoftDeletes(); // Xóa cột deleted_at
        });
    }
}

Chạy migration để cập nhật cơ sở dữ liệu:

php artisan migrate

Bước 2: Sử dụng các phương thức xóa mềm

2.1. Xóa mềm bản ghi

Để xóa mềm một bản ghi, bạn có thể sử dụng phương thức delete():

$post = Post::find(1); // Tìm bản ghi có id = 1
$post->delete(); // Xóa mềm bản ghi

2.2. Khôi phục bản ghi đã xóa mềm

Nếu bạn muốn khôi phục một bản ghi đã xóa mềm, bạn có thể sử dụng phương thức restore():

$post = Post::withTrashed()->find(1); // Tìm bản ghi đã xóa mềm
$post->restore(); // Khôi phục bản ghi

2.3. Xóa hoàn toàn bản ghi

Để xóa hoàn toàn một bản ghi (bỏ qua xóa mềm), bạn có thể sử dụng phương thức forceDelete():

$post = Post::withTrashed()->find(1); // Tìm bản ghi đã xóa mềm
$post->forceDelete(); // Xóa hoàn toàn bản ghi

Bước 3: Truy vấn các bản ghi xóa mềm

Laravel cung cấp các phương thức để truy vấn các bản ghi xóa mềm:

3.1. Truy vấn tất cả các bản ghi (bao gồm đã xóa)

Sử dụng phương thức withTrashed() để truy vấn tất cả các bản ghi, bao gồm cả những bản ghi đã xóa mềm:

$posts = Post::withTrashed()->get(); // Lấy tất cả các bản ghi, bao gồm đã xóa

3.2. Truy vấn các bản ghi chưa xóa

Để chỉ truy vấn các bản ghi chưa xóa, bạn có thể sử dụng phương thức all():

$posts = Post::all(); // Lấy tất cả các bản ghi chưa xóa

3.3. Truy vấn các bản ghi đã xóa

Sử dụng phương thức onlyTrashed() để truy vấn các bản ghi đã xóa mềm:

$posts = Post::onlyTrashed()->get(); // Lấy tất cả các bản ghi đã xóa

Kết luận

Xóa mềm là một kỹ thuật hữu ích giúp bạn quản lý dữ liệu một cách linh hoạt trong ứng dụng Laravel. Với tính năng SoftDeletes, bạn có thể dễ dàng đánh dấu các bản ghi là “đã xóa” mà không thực sự xóa chúng khỏi cơ sở dữ liệu. Điều này không chỉ giúp bạn bảo toàn dữ liệu mà còn cho phép khôi phục lại các bản ghi khi cần thiết. Bằng cách làm theo hướng dẫn trên, bạn có thể thực hiện xóa mềm trong dự án của mình một cách dễ dàng và hiệu quả.