PlusMagi's Blog By Pitt Phunsanit Backend Laravel: DataTables & Eloquent

Laravel: DataTables & Eloquent

ในโลกของการพัฒนาเว็บแอปพลิเคชันที่ทันสมัย การแสดงผลข้อมูลจำนวนมากในรูปแบบตาราง (DataTables) เป็นสิ่งที่หลีกเลี่ยงไม่ได้ อย่างไรก็ตาม การใช้ DataTables อย่างมีประสิทธิภาพนั้น ไม่ได้หมายถึงการดึงข้อมูลทั้งหมดมาแสดงผลในครั้งเดียว แต่ต้องใช้เทคนิคที่เรียกว่า Server-Side Processing

สำหรับนักพัฒนาที่ใช้ Laravel และ Eloquent ORM การใช้ไลบรารีสำเร็จรูปอาจสะดวก แต่การเข้าใจหลักการทำงานเบื้องหลังและเขียนโค้ดด้วยตัวเองจะช่วยให้เราควบคุมประสิทธิภาพ (Performance) และความยืดหยุ่นของระบบได้สูงสุด บทความนี้จะพาคุณไปดูวิธีการสร้าง DataTables ที่ทรงพลัง โดยใช้พลังของ Laravel และ Eloquent ร่วมกับระบบฐานข้อมูล PostgreSQL

⚙️ หลักการทำงานของ Server-Side Processing

หัวใจสำคัญของ DataTables คือการที่มันไม่ได้ร้องขอข้อมูลทั้งหมด แต่จะส่งคำขอ (AJAX Request) ที่ระบุขอบเขตของข้อมูลที่ต้องการมาให้ Controller ของเรา ซึ่งประกอบด้วยพารามิเตอร์สำคัญ เช่น draw (รอบการเรียก), start (แถวเริ่มต้น), และ length (จำนวนแถวที่ต้องการ)

เราจะใช้ Eloquent Query Builder ในการรับพารามิเตอร์เหล่านี้มาสร้างเงื่อนไข (WHERE clauses) ในการ Query ข้อมูลจาก PostgreSQL โดยตรง ทำให้ฐานข้อมูลจัดการการกรองและจำกัดข้อมูลให้เราก่อนส่งกลับไปเป็น JSON

💡 ตัวอย่างการ Implement ใน Laravel Controller

นี่คือตัวอย่างการเขียนเมธอด index ใน Controller เพื่อจัดการ AJAX Request ของ DataTables โดยการสร้าง Query Builder ที่รับค่าการค้นหา (Search) และการกรอง (Filter) ต่างๆ:

PHP

/**
 * Display a listing of the resource (DataTables AJAX).
 */
public function index(Request $request)
{
    // 1. เตรียมโครงสร้าง JSON สำหรับ DataTables
    $json = [
        'data' => [],
        'draw' => $request->input('draw', 1),
        'recordsFiltered' => 0,
        'recordsTotal' => 0,
    ];

    $query = Ticket::query();
    $json['recordsTotal'] = $query->count();

    // 2. ตรวจสอบและสร้างเงื่อนไขการค้นหา (Global Search)
    if ($request->has('search') && !empty($request->search)) {
        $query->where('column_name', 'LIKE', '%' . $request->search . '%');
    }

    // 3. ตรวจสอบและสร้างเงื่อนไขการกรองเฉพาะคอลัมน์ (Filtering)
    if ($request->has('search')['category_id'] && is_int($request->search['category_id'])) {
        $query->where('category_id', $request->search['category_id']);
    }
    
    // 4. ดึงข้อมูลที่ถูกกรองและจำกัดจำนวน (Apply Limits)
    $data = $query->paginate($request->length)->get();
    $json['data'] = $data->toArray();
    $json['recordsFiltered'] = $query->count(); // ในกรณีที่ไม่มีการจำกัดหน้า

    return response()->json($json);
}

🚀 การปรับปรุงประสิทธิภาพด้วย PostgreSQL

เมื่อใช้ PostgreSQL ร่วมกับ Eloquent ควรให้ความสำคัญกับการทำ Indexing บนคอลัมน์ที่ใช้ในการกรอง (Filter) และค้นหา (Search) เสมอ เช่น category_id หรือ status_id การทำ Index ที่เหมาะสมจะช่วยให้ Query ของคุณทำงานได้อย่างรวดเร็วแม้จะมีข้อมูลหลายล้านแถว

✅ บทสรุป

การเขียน DataTables ด้วย Laravel และ Eloquent โดยการจัดการ Server-Side Processing ด้วยตัวเองนั้น แม้จะดูซับซ้อนกว่าการใช้ไลบรารีสำเร็จรูป แต่ก็ให้ความเข้าใจในระดับสถาปัตยกรรม (Architectural Level) อย่างแท้จริง ทำให้คุณสามารถปรับแต่งการ Query ให้เข้ากับความต้องการทางธุรกิจที่ซับซ้อนได้ 100% และยังคงรักษาประสิทธิภาพสูงสุดในการดึงข้อมูลจาก PostgreSQL ได้อย่างยอดเยี่ยม