5分鐘完成資料表軟刪除實作

5分鐘完成資料表軟刪除實作

什麼是軟刪除?

首先,我有必要向你說明到底什麼是軟刪除。你應該已經掌握物理刪除,也就是真的將某一筆資料從資料庫抹去,一旦這麼做之後就再也救不回來了

而軟刪除有別於物理刪除,並非真的將資料刪去,而只是在某個特定欄位上做個註記,代表它已被刪除。之後做任何的查詢都無法取出它,除非你指定要查詢被軟刪除的資料

這麼做的好處是,你仍能夠取得這些被軟刪除的資料,甚至在有一天能夠被還原。某些特定表格比如訂單多半不會真的將資料刪除而是透過軟刪除來隱藏起來

好消息是 Laravel 本身就內建支援軟刪除,你只需要做一點點的設定,讓 Laravel 知道在執行 delete或 destroy 時,模型的記錄不要被真的刪除,只要做個註記即可,透過一個名為 deleted_at 的時間戳記欄位,只要該欄位有值就代表該資料已被刪除。

快速入門

以下,我們就以 Order 模型納入支援軟刪除來進行實作示範

Step 1.建立 Migration 檔案

你需要建立一個新的遷移,將名為 deleted_at 的欄位新增到 orders 表格中

php artisan make:migration add_soft_delete_to_orders --table=orders

Step 2.編輯 Migration 檔案後執行

//xxxx_xx_xx_xxxxxx_add_soft_delete_to_orders.php

public function up()
{
    Schema::table('orders', function(Blueprint $table)
    {
        $table->softDeletes();
    });
}

public function down()
{
    Schema::table('orders', function(Blueprint $table)
    {
        $table->dropColumn('deleted_at');
    });
}

編輯完後,開啟 Terminal ,輸入以下指令來進行資料表變更

php artisan migrate

Step 3.宣告模型要支援軟刪除

你需要在 Order 模型內使用 SoftDeletes 這個 Trait,並且將 deleted_at 這個軟刪除欄位加入 dates 屬性內

//app\Models\Order.php

namespace App;
...
use Illuminate\Database\Eloquent\SoftDeletes;

class Order extends Model {
    use SoftDeletes;
    protected $dates = ['created_at','updated_at','deleted_at'];
}

一旦你完成這些設置之後,下次刪除此模型的紀錄時,deleted_at 欄位的內容將被設定為當前時間。而任何 deleted_at 欄位非空的記錄,都不會包含在任何查詢結果中,因此看起來如同被刪除一般

更棒的是,就算你不小心誤刪了任何資料,都還可以將 deleted_at 欄位設為空來將其還原,再也不用擔心會誤刪用戶或者是訂單了

查詢軟刪除資料

如果你希望在進行查詢時,一並查詢被軟刪除的資料,可以透過以下的語法

$orders = Order::withTrashed()->get();


分享這篇文章:

訂閱電子報,索取 Laravel 學習手冊

價值超過 3000 元,包含常用 Laravel 語法與指令!

一小時免費求職講座

3個應徵軟體工程師前該知道的秘訣

取得免費課程連結

Laravel 百萬年薪特訓營

從最基礎的 PHP 語法開始,包含所有你該知道的網頁基礎知識,連同 Laravel 從零開始一直到實戰,最後還將告訴你如何找好工作,讓你及早擁有百萬年薪