PlusMagi's Blog By Pitt Phunsanit Backend,Database สร้าง grid ใน laravel

สร้าง grid ใน laravel

การแสดงผลข้อมูลจำนวนมากอย่างเป็นระเบียบ (Data Grids) ถือเป็นหัวใจสำคัญของเว็บแอปพลิเคชันระดับ Enterprise-level อย่างไรก็ตาม การสร้าง Grid ที่มีประสิทธิภาพสูง ไม่ใช่แค่การดึงข้อมูลมาแสดง แต่รวมถึงการจัดการ Pagination, Filtering, และ Sorting ข้อมูลขนาดใหญ่ได้อย่างรวดเร็วและเชื่อถือได้

ในโลกของการพัฒนาระบบที่ต้องการความเร็วระดับสูง แม้ว่า Laravel จะเป็น Framework ที่ยอดเยี่ยมในการจัดการ Business Logic และ View Layer แต่หัวใจสำคัญของประสิทธิภาพและความซับซ้อนในการ Query ข้อมูลขนาดใหญ่ (High-Volume Data Query) มักจะอยู่ที่ระบบฐานข้อมูล การใช้ Laravel ร่วมกับคุณสมบัติขั้นสูงของ PostgreSQL จึงเป็นแนวทางที่ Senior Architect ต้องเลือกใช้ เพื่อให้ได้ประสิทธิภาพสูงสุดในการสร้าง Data Grid ที่ทรงพลัง

🚀 ทำไม PostgreSQL คือคำตอบสำหรับ Data Grids ขั้นสูง?

เมื่อเทียบกับระบบฐานข้อมูลทั่วไป PostgreSQL โดดเด่นด้วยฟีเจอร์ระดับสูงที่ตอบโจทย์การ Query ข้อมูลที่ซับซ้อนได้อย่างเหนือกว่า:

  • JSONB Support: รองรับการจัดเก็บและ Query ข้อมูลกึ่งโครงสร้าง (Semi-structured data) ได้อย่างรวดเร็ว ทำให้สามารถทำ Filtering ตาม Metadata ต่างๆ ได้ง่ายและมี Index ที่มีประสิทธิภาพสูง
  • Window Functions & CTEs: ช่วยให้เราสามารถคำนวณค่าที่ซับซ้อน หรือจำลอง Logic การกรอง/แบ่งหน้า (Pagination/Filtering) ที่เป็นขั้นตอนได้ภายใน Query เดียว โดยไม่ต้องเขียนโค้ด PHP เพิ่มเติมมากนัก
  • Advanced Indexing: รองรับการทำ Index บนข้อมูลประเภท JSONB ทำให้การค้นหาข้อมูลขนาดใหญ่ที่มีเงื่อนไขซับซ้อนมีประสิทธิภาพสูงกว่าเดิมหลายเท่าตัว

💡 การสร้าง Data Grid ด้วย PostgreSQL และ Laravel

ในการสร้าง Grid ที่สมบูรณ์ เราจะต้องใช้ประโยชน์จากความสามารถในการ Query ของ PostgreSQL โดยตรงผ่าน Laravel’s Query Builder หรือ `DB::select()` เพื่อควบคุม SQL ได้อย่างเต็มที่ นี่คือตัวอย่างการสร้าง Query ที่มีการกรอง (Filtering) และการจำกัดหน้า (Pagination) บนข้อมูลที่มี Metadata เก็บในรูปแบบ JSONB:

SQL

-- สมมติว่าเรามีตาราง 'products' และมีคอลัมน์ 'metadata' เป็น JSONB<br><br>SELECT * FROM products<br>WHERE metadata ->> 'category' = 'electronics' -- กรองตาม JSONB key<br>  AND metadata ->> 'status' = 'active' -- กรองตาม JSONB key<br>ORDER BY created_at DESC<br>LIMIT 10 OFFSET 0; -- Pagination: แสดง 10 รายการ, เริ่มจากรายการที่ 0

คำอธิบายโค้ด:

  1. `metadata ->> ‘category’`: เป็นการดึงค่าที่เป็นข้อความ (text) จากคีย์ ‘category’ ในคอลัมน์ JSONB ซึ่งทำให้เราสามารถใช้มันในเงื่อนไข `WHERE` ได้เหมือนคอลัมน์ปกติ
  2. `LIMIT` และ `OFFSET`: เป็นมาตรฐานในการทำ Pagination ที่มีประสิทธิภาพสูง

💻 การผสานรวมใน Laravel Code (PHP)

ในระดับ Laravel, เราจะใช้ `DB::select()` เพื่อส่งคำสั่ง SQL ที่ซับซ้อนนี้ไปให้ PostgreSQL ประมวลผล:

PHP

use Illuminate\Support", "DB";<br><br>// ข้อมูลสำหรับ Filter (เช่น category='electronics', status='active')<br>$filters = ["category" => "electronics", "status" => "active"];<br>$limit = 10;<br>$offset = 0;<br><br>// สร้างเงื่อนไข WHERE แบบ Dynamic<br>$whereClauses = [];<br>foreach ($filters as $key => $value) {<br>    $whereClauses[] = "metadata ->> '{$key}' = ?";<br>}<br>// รวม Query ทั้งหมด<br>$sql = "SELECT * FROM products WHERE " . implode(" AND ", $whereClauses) . " ORDER BY created_at DESC LIMIT ? OFFSET ?;";<br><br>// Execute Query<br>$results = DB::select($sql, array_merge([$filters['category'], $filters['status']], [$limit, $offset]));<br><br>return $results;<br>

✅ บทสรุปสำหรับ Senior Architect

การสร้าง Data Grid ที่มีประสิทธิภาพสูงใน Laravel ไม่ได้หมายถึงการใช้ Eloquent Model เพียงอย่างเดียว แต่คือการเข้าใจและใช้ประโยชน์จากคุณสมบัติระดับสูงของฐานข้อมูลอย่าง PostgreSQL อย่างเต็มที่ การใช้ JSONB, Window Functions, และการ Query ที่ถูกออกแบบมาอย่างดี จะช่วยให้แอปพลิเคชันของคุณสามารถรองรับข้อมูลขนาดใหญ่ (Scalability) และตอบสนองต่อการกรองที่ซับซ้อน (Filtering Performance) ได้อย่างรวดเร็ว ทำให้ระบบของคุณอยู่ในระดับ Enterprise-grade อย่างแท้จริง