Soft Deletes เป็นฟีเจอร์ของ Laravel ที่ช่วยให้การลบข้อมูลในฐานข้อมูลเป็นไปอย่างปลอดภัยมากขึ้น โดยข้อมูลที่ถูกลบจะไม่ถูกลบออกจากฐานข้อมูลจริงๆ แต่จะถูกทำเครื่องหมายว่า “ลบแล้ว” ด้วยการบันทึกเวลาที่ลบลงในคอลัมน์ deleted_at
ของตารางนั้น ฟีเจอร์นี้ช่วยให้เราสามารถกู้คืนข้อมูลที่ลบไปแล้วได้หากต้องการ
การตั้งค่า Soft Deletes ใน Model
- เพิ่มคอลัมน์
deleted_at
ในตารางก่อนอื่นต้องเพิ่มคอลัมน์deleted_at
ในตารางที่ต้องการใช้ Soft Deletes สามารถเพิ่มได้โดยใช้คำสั่งsoftDeletes()
ในไฟล์ Migration:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddSoftDeletesToPostsTable extends Migration
{
public function up()
{
Schema::table('posts', function (Blueprint $table) {
$table->softDeletes();
});
}
public function down()
{
Schema::table('posts', function (Blueprint $table) {
$table->dropSoftDeletes();
});
}
}
คำสั่ง softDeletes()
จะสร้างคอลัมน์ deleted_at
ซึ่งเก็บค่าเวลาที่ข้อมูลถูกลบ
เพิ่ม Trait SoftDeletes
ใน Model
ใน Model ที่ต้องการใช้งาน Soft Deletes ให้ใช้ Trait SoftDeletes
เพื่อเปิดใช้งานฟีเจอร์นี้
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
use SoftDeletes;
protected $dates = ['deleted_at'];
}
- ในตัวอย่างนี้ เราเพิ่ม
use SoftDeletes;
เพื่อบอกให้ Laravel รู้ว่า Model นี้รองรับการใช้งาน Soft Deletes และกำหนดdeleted_at
ให้เป็นประเภทวันที่ ($dates
) เพื่อให้ Laravel จัดการได้อย่างถูกต้อง
การใช้งาน Soft Deletes
หลังจากตั้งค่าแล้ว เราสามารถใช้งาน Soft Deletes ได้ทันทีผ่านเมธอดต่างๆ ของ Eloquent
- การลบข้อมูลด้วย Soft Deletesเมื่อใช้คำสั่ง
delete()
ข้อมูลจะไม่ถูกลบออกจากฐานข้อมูลจริง แต่จะมีการบันทึกเวลาที่ลบลงในคอลัมน์deleted_at
$post = Post::find(1);
$post->delete(); // ข้อมูลจะถูกลบแบบ Soft Delete
2. การดึงข้อมูลที่ไม่ถูกลบ
โดยค่าเริ่มต้น Laravel จะดึงข้อมูลที่ยังไม่ถูกลบมาแสดงเท่านั้น เช่น เมื่อเรียกใช้ Post::all()
จะไม่รวมข้อมูลที่ถูกลบแบบ Soft Delete
$posts = Post::all(); // ดึงข้อมูลที่ยังไม่ถูกลบ
3. การดึงข้อมูลทั้งหมดรวมถึงข้อมูลที่ถูกลบ
ใช้เมธอด withTrashed()
เพื่อดึงข้อมูลทั้งหมดรวมถึงข้อมูลที่ถูกลบแบบ Soft Delete
$allPosts = Post::withTrashed()->get(); // ดึงข้อมูลทั้งหมด รวมข้อมูลที่ถูกลบ
4. การดึงเฉพาะข้อมูลที่ถูกลบเท่านั้น
ใช้เมธอด onlyTrashed()
เพื่อดึงข้อมูลที่ถูกลบแบบ Soft Delete เท่านั้น
$deletedPosts = Post::onlyTrashed()->get(); // ดึงเฉพาะข้อมูลที่ถูกลบ
5. การกู้คืนข้อมูลที่ถูกลบ
ใช้เมธอด restore()
เพื่อกู้คืนข้อมูลที่ถูกลบแบบ Soft Delete
$post = Post::withTrashed()->find(1);
$post->restore(); // กู้คืนข้อมูลที่ถูกลบ
6. การลบข้อมูลแบบถาวร
หากต้องการลบข้อมูลแบบถาวร (ไม่สามารถกู้คืนได้) ใช้เมธอด forceDelete()
$post = Post::withTrashed()->find(1);
$post->forceDelete(); // ลบข้อมูลแบบถาวร
การนำไปใช้งาน
Soft Deletes เหมาะกับการใช้งานในกรณีที่ข้อมูลไม่ควรถูกลบอย่างถาวร เช่น ข้อมูลผู้ใช้งาน ข้อมูลโพสต์ หรือข้อมูลสำคัญอื่นๆ ฟีเจอร์นี้ช่วยเพิ่มความปลอดภัยให้กับการจัดการข้อมูลในระบบ และสามารถเรียกคืนข้อมูลได้เมื่อต้องการ