Dev to webs {Coding…}

เรียนรู้การพัฒนาซอฟเวอร์ เพื่อความรู้ที่ยั่งยืน

บทที่ 29: การใช้ Soft Deletes กับ Model

Soft Deletes เป็นฟีเจอร์ของ Laravel ที่ช่วยให้การลบข้อมูลในฐานข้อมูลเป็นไปอย่างปลอดภัยมากขึ้น โดยข้อมูลที่ถูกลบจะไม่ถูกลบออกจากฐานข้อมูลจริงๆ แต่จะถูกทำเครื่องหมายว่า “ลบแล้ว” ด้วยการบันทึกเวลาที่ลบลงในคอลัมน์ deleted_at ของตารางนั้น ฟีเจอร์นี้ช่วยให้เราสามารถกู้คืนข้อมูลที่ลบไปแล้วได้หากต้องการ

การตั้งค่า Soft Deletes ใน Model

  1. เพิ่มคอลัมน์ 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'];
}

  1. ในตัวอย่างนี้ เราเพิ่ม use SoftDeletes; เพื่อบอกให้ Laravel รู้ว่า Model นี้รองรับการใช้งาน Soft Deletes และกำหนด deleted_at ให้เป็นประเภทวันที่ ($dates) เพื่อให้ Laravel จัดการได้อย่างถูกต้อง

การใช้งาน Soft Deletes

หลังจากตั้งค่าแล้ว เราสามารถใช้งาน Soft Deletes ได้ทันทีผ่านเมธอดต่างๆ ของ Eloquent

  1. การลบข้อมูลด้วย 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 เหมาะกับการใช้งานในกรณีที่ข้อมูลไม่ควรถูกลบอย่างถาวร เช่น ข้อมูลผู้ใช้งาน ข้อมูลโพสต์ หรือข้อมูลสำคัญอื่นๆ ฟีเจอร์นี้ช่วยเพิ่มความปลอดภัยให้กับการจัดการข้อมูลในระบบ และสามารถเรียกคืนข้อมูลได้เมื่อต้องการ