PlusMagi's Blog By Pitt Phunsanit Backend,Database PHPWord: กรอกข้อมูลใส่ template

PHPWord: กรอกข้อมูลใส่ template

“>

ในฐานะ System Specialist ระดับ Senior Architect โจทย์ที่ท้าทายที่สุดในการพัฒนาแอปพลิเคชันขนาดใหญ่คือการจัดการกับข้อมูลที่มีโครงสร้างซับซ้อนและต้องมีการทำซ้ำ (Repeating Blocks) เช่น รายงานผลการขาย หรือใบสั่งซื้อที่มีรายการสินค้าหลายบรรทัด การส่งออกข้อมูลเหล่านี้ไปเป็นไฟล์เอกสาร (เช่น Word Template) มักจะทำให้เกิดการพึ่งพา Library ภายนอกอย่าง PHPWord หรือ Report Generator ต่างๆ

“>

แต่ก่อนที่เราจะพึ่งพาการทำซ้ำในระดับแอปพลิเคชัน (Application Layer) เราควรพิจารณาแหล่งกำเนิดของข้อมูลทั้งหมด นั่นคือฐานข้อมูล PostgreSQL การใช้พลังของ SQL ขั้นสูงในการ ‘จำลอง’ โครงสร้างแบบ Template โดยตรง ทำให้กระบวนการเตรียมข้อมูลสำหรับการส่งออก (Export) มีประสิทธิภาพสูงที่สุดและลดภาระของแอปพลิเคชันได้อย่างมาก

💡 แนวคิดหลัก: การจำลอง Templating Logic ใน PostgreSQL

“>

แทนที่จะให้แอปพลิเคชันวนลูป (Loop) เพื่อสร้างชุดข้อมูลซ้ำๆ เราจะใช้ฟังก์ชันและโครงสร้างของ PostgreSQL เพื่อให้ฐานข้อมูลจัดการเรื่องความซับซ้อนของการทำซ้ำ (Iteration) เอง ซึ่งหลักการสำคัญคือการใช้ generate_series() ร่วมกับ Common Table Expressions (CTE) และการ Join ข้อมูลหลายชุดเข้าด้วยกัน

🛠️ เครื่องมือสำคัญ: generate_series() และ CTEs

“>

ฟังก์ชัน generate_series(start, end, step) เป็นหัวใจหลักในการสร้างชุดข้อมูลที่ทำซ้ำได้ (Row Generation) โดยไม่จำเป็นต้องมีข้อมูลจริงในตารางนั้นๆ นอกจากนี้ การใช้ CTEs (Common Table Expressions) ช่วยให้เราสามารถแบ่งขั้นตอนการคำนวณที่ซับซ้อนออกเป็นส่วนย่อยๆ ทำให้โค้ดอ่านง่ายและจัดการได้ง่ายยิ่งขึ้น

🚀 ตัวอย่าง: การสร้างข้อมูลใบสั่งซื้อจำลองด้วย PostgreSQL

“>

สมมติว่าเรามีตารางหลัก (Orders) และตารางสินค้า (Products) แต่เราต้องการจำลองการสร้างรายงานที่ต้องมีการทำซ้ำรายการสินค้า 3 ครั้งเสมอ (เช่น รายงานสรุป 3 ส่วน) เราสามารถใช้ generate_series() เพื่อสร้าง Row Identifier ที่ทำซ้ำได้:

WITH order_header AS (SELECT 1 AS order_id, 'Report ABC' AS report_name, '2024-07-25' AS report_date), 
products AS (SELECT 'apple' AS product_name, 10.50 AS price), 
series_generator AS (SELECT generate_series(1, 3) AS item_index) 
SELECT 
    oh.report_name, 
    oh.report_date, 
    pg.product_name, 
    pg.price, 
    s.item_index 
FROM 
    order_header oh 
CROSS JOIN 
    products pg 
CROSS JOIN 
    series_generator s 
LIMIT 1;


">

ผลลัพธ์ที่ได้คือชุดข้อมูลที่มีโครงสร้างครบถ้วน (Report Name, Date, Product Name, Price, Item Index) โดยที่รายการสินค้า (apple) ถูกทำซ้ำ 3 แถวตามที่กำหนดใน generate_series(1, 3) ซึ่งข้อมูลชุดนี้พร้อมสำหรับการส่งออก (Export) ไปให้ PHPWord หรือระบบ Report อื่นๆ นำไปใช้เติม Template ได้ทันที

✅ บทสรุป: ประสิทธิภาพและความยืดหยุ่น

">

การย้ายตรรกะการทำซ้ำ (Templating Logic) จากระดับแอปพลิเคชันมาสู่ระดับฐานข้อมูลด้วย PostgreSQL ไม่เพียงแต่ช่วยลดความซับซ้อนของโค้ด (Code Complexity) เท่านั้น แต่ยังเพิ่มประสิทธิภาพในการประมวลผลข้อมูลขนาดใหญ่ (Scalability) อย่างมหาศาล ทำให้ระบบของคุณมีความเสถียรและรวดเร็วในการสร้างรายงานที่ซับซ้อนได้อย่างแท้จริง