Laravel View Composer

Laravel Eloquent: Soft Delete

Hi các bạn,

Khi còn sinh viên, chúng ta hay viết app CRUD các kiểu đồ, DELETE là cứ DELETE thẳng tay lun sợ bố con thằng nào (Hard Delete – Delete From xxx …).

Nhưng khi ta đi làm, hay viết những real world project, thì data là thứ rất là quan trọng, không phải cứ thích là hard delete, nên chúng ta cần fải lưu ý điều này.

Vậy nên chúng ta có thuật ngữ là Soft Delete, mang tiếng là xóa nhưng thật ra vẫn lưu dưới DB, ko hiển thị ra thui or người dùng đặc biệt mới xem dc, đại loại vậy.

Nhìn như trên, ta sẽ có nhiều solutions khác nhau như thêm 1 column tinyInteger (coi nó là 1 boolean) để nhận biết, hay dùng enum (yes, no),…

Và rất hay cho Laravel, nó đã dựng sẵn cho chúng ta tính năng Soft Delete và apply dc cho Eloquent Model. Yeah, lấy ra xài thui

1/ Cách mà Laravel Eloquent: Soft Delete hoạt động

Về phía Database, cụ thể là Laravel sẽ tạo ra 1 cột là deleted_at, nullable và default sẽ là null.

Vậy suy ra:

  • NULL => chưa bị xóa
  • Có ngày tháng trong cột delete_at => đã bị xóa

Và ở phía core, mỗi lần Eloquent query, nó sẽ tự động thêm vào query của chúng ta cái điều kiện này:

SELECT …. WHERE deleted_at IS NULL

Và từ đó, ta sẽ retrieve được các rows chưa bị Soft Delete.

Đó là nhìn chung về cách xử lý của Laravel Eloquent: Soft Delete hoạt động, và tất nhiên, ta cũng có những cái scope để query những rows mà đã bị soft deleted.

2/ Implement Laravel Eloquent: Soft Delete vào Table của bạn

Ta sẽ có 2 phần nhé:

2.1/ Migration

Ở migration, class BluePrint của Laravel sẽ có một phương thức để tạo ra cột deleted_at, sử dụng như sau:

Schema::create(self::TABLE_NAME, function (Blueprint $table) {
    // your code above...
    $table->softDeletes();
});

Nếu bạn ko sử dụng migration của Laravel (xài Laravel mà ko sử dụng migration thì xài chi trời …) thì bạn fải tự tạo 1 cột có tên là deleted_at, nullable default null nhé.

Vậy là ta đã chuẩn bị xong phần migration, chạy migration như bình thường nhé rùi tiếp tục qua part 2.

2.2/ Eloquent

Tại Eloquent Model của bạn, đầu tiên bạn cần use cái trait này của Laravel:

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

class SethPhat extends Model {
    use SoftDeletes;
    ...
}

Tiếp theo, ta phải định nghĩa dates cho cột deleted_at, như sau:

protected $dates = ['deleted_at'];

Xong, bắt đầu tiến hành sử dụng thoy.

3/ Sử dụng Laravel Eloquent: Soft Delete

Đối với các query retrieve data, cái điều kiện deleted_at IS NULL sẽ tự động apply mỗi query.

Cũng như xóa bình thường, ta chỉ cần gọi method delete là dc:

$phat = SethPhat::find(1);
$phat->delete();

Để kiểm tra xem record này đã bị soft deleted hay chưa, dùng method trashed:

if ($phat->trashed()) {
// do something...
}

Nếu như ta cần HARD DELETE, thì ta sẽ dùng method forceDelete:

$phat->forceDelete();

Ngoài ra, Laravel cũng c.bị các scope để ta có thể query các records đã bị Soft Deleted, như sau:

// lấy records kèm với những row đã bị soft deleted
$results = SethPhat::withTrashed()->get();

// chỉ lấy những row đã bị soft deleted
$results = SethPhat::onlyTrashed()->get();

Và cuối cùng, hồi sinh lại record đã bị soft deleted như sau:

// hồi sinh nè
$phat->restore();

Rất đơn giản và dễ dàng fải ko nào. Các hàm ở trên đều sử dụng dc cho relationship nhé.

Lưu ý: khi đã soft deleted record rùi, cách duy nhất để view dc record là fải thông qua scope or where deleted_at is not null nhé.

Vd:

// lấy ra single record đã bị soft deleted
$phat = SethPhat::withTrashed()->find(1);

4/ Kết luận về Laravel Eloquent: Soft Delete

Cũng như mở đầu bài, với Soft Delete mà Laravel đã define sẵn, ta có thể implement và sử dụng dễ dàng.

Và từ đó, ta cũng thấy dc là data rất quan trọng, ko fải thích là xóa đâu.

Cám ơn các bạn đã theo dõi!

facebook
google+
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Sandaru. Hiện đang là một Full-Stack Developer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mình rất thích chia sẻ những thứ kiến thức liên quan tới lĩnh vực này. Mong các bạn ủng hộ web của mình!

Leave a Reply

Your email address will not be published. Required fields are marked *

Bình luận qua Facebook