[Tips] Sử dụng Soft Delete trong FuelPHP

Spread the love

Hôm qua mình có 1 task phải liên quan đến delete file ảnh đặt trên S3, tuy nhiên lại có thêm yêu cầu là khi bật cờ delete cả S3 thì sẽ phải delete cả những images (đã bị delete trước đó ở ổ đĩa local), và thật bất ngờ, mình không query được những thằng mình đã bật cờ delete_at lên. Nhìn vào model thì thấy

class Model_XXXYY extends \Orm\Model_Soft
{
    //Code logic goes here
}

Ồ vậy là thằng FuelPHP này cũng có Soft-Delete như Laravel. Thử xem document của nó có đề cập gì không

Cài đặt Soft-Delete cho model trong FuelPHP

Theo như link này [論理削除モデル – Orm パッケージ – FuelPHP ドキュメント][1] thì có vẻ từ bảng 1.5, mới có hỗ trợ Soft-Delete.

Để dùng Soft_Delete cho Model, chúng ta có thể thiết lập như bên dưới

class Model_Employee extends \Orm\Model_Soft
{
    protected static $_soft_delete = array(
        'deleted_field' => 'deleted',
        'mysql_timestamp' => true,
    );
}

Đoạn code trên chúng ta thiết lập thuộc tính $_soft_delete là một mảng, và có 2 phần tử bao gồm * deleted_field : tên của column, dùng để đánh dấu là đã bị soft_delete. Default là delete_at, tuy nhiên chúng ta có thể config để dùng tên cột khác. Ví dụ ở trên mình đã override để dùng cột deleted_field * mysql_timestamp: chúng ta có thể thiết lập được một trong 2 giá trị mysql_timestap hoặc unix_timestamp do đó, nếu thiết lập mysql_timestamp là true, thì khi một model bị delete, giá trị của cột delete_field2017-08-12 14:00:23 chẳng hạn. Tương tự cho trường hợp là unix_timestamp thì giá trị của cột delete_field có thể sẽ là 189964390 chẳng hạn .

Cách dùng Soft-Model

Về cơ bản do Soft_Model extends từ class Orm\Model nên chúng ta có thể dùng những hàm tương tự như bên Orm Model thường. Tuy nhiên những hàm như findquery sẽ lấy những record có deleted_at là khác null.

Search những record đã bị deleted

Bù lại chúng ta sẽ có thể sử dụng hàm find_deleteddeleted để tìm những record đã bị Soft Delete. Cùng tham khảo ví dụ bên dưới

$model = \Model_Employee::find_deleted(1); // return the deteled record with id = 1
$model = \Model_Employee::deleted(1); // return the deleted record with id = 1

Restore những record đã bị delete

Ngoài ra chúng ta còn có thể phục hồi lại những record đã bị deleted bằng cách dùng hàm restoreundelete . Hai hàm này thì có ý nghĩa như nhau và là alias của nhau nên chúng ta có thể sử dụng qua lại thoải mái

$model =  \Model_Employee::find_deleted(1);
$model->undelete() //field `deleted_at` sẽ được set về null

Disable Soft_Model khi query

Nhiều khi bạn muốn disable, hoặc là tìm một lúc nhiều record bị soft-delete, chúng ta thấy Soft_Model thật là vướng, vì chỉ cung cấp cho chúng ta find_deleted hoặc deleted như vậy rất là tù túng nếu so sánh với Laravel chúng ta có thể gọi dạng $model->withTrashed()->where(…) May mắn là chúng ta có thể override lại cách query soft_model trong static class như bên dưới

    \Model_Employee::disable_filter(); // khi muốn query cả những record bị soft deleete
   \Model_Employee::enable_filter(); // khi không muốn query những record bị soft delete

TL;DR

FuelPHP cung cấp Soft Delete model như laravel, tuy nhiên Soft Model là một class extends chứ không phải là traits như ở Laravel. Soft Model của Fuel có các tính năng tìm kiếm cũng như phục hồi những record bị Soft delete. Tuy nhiên các tính năng của Soft Model của Fuel không dễ dùng như Laravel

Leave a Reply

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