Tập tành xóa cứng xóa mềm Laravel Soft Delete

2nd Nov 2022
Laravel Soft Delete
Table of contents

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.

Bạn thấy bài viết này như thế nào?
0 reactions

Add new comment

Image CAPTCHA
Enter the characters shown in the image.

Related Articles

Mỗi kết nối cơ sở dữ liệu được định nghĩa trong một mảng, với tên kết nối là khóa của mảng

Eager Loading là một kỹ thuật tối ưu hóa truy vấn cơ sở dữ liệu trong Laravel, giúp tăng tốc độ truy vấn và giảm số lượng truy vấn cần thiết để lấy dữ liệu liên quan đến một bản ghi.

Để sử dụng Eager Loading với điều kiện trong Laravel, bạn có thể sử dụng phương thức whereHas hoặc orWhereHas trong Eloquent Builder.

E hiểu đơn giản vầy nha. auth() hay Auth trong laravel là những function global hay class, nó cũng chỉ là 1 thôi

Xin chào các bạn, tuần này mình sẽ viết một bài về cách xử lý Real Time(thời gian thực) với Laravel và Pusher