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();