ข้ามไปยังเนื้อหาหลัก
คู่มือระบบ เนื้อหาผ่านการตรวจสอบแล้ว

การใช้ PDO กับ ORM (Object-Relational Mapping)

บทความนี้แนะนำ Object-Relational Mapping (ORM) ซึ่งเป็น abstraction ที่สูงกว่า Database Abstraction Layer (DAL) ที่เรียนรู้ไปก่อนหน้านี้ โดย ORM ช่วยให้ทำงานกับ...

การใช้ PDO กับ ORM (Object-Relational Mapping)

จากบทที่แล้วที่เราได้เรียนรู้เกี่ยวกับ Database Abstraction Layer (DAL) ซึ่งเป็นชั้น abstraction ที่ช่วยให้การจัดการฐานข้อมูลด้วย PDO ง่ายขึ้น ในบทนี้ เราจะก้าวไปอีกขั้นด้วยการทำความรู้จักกับ Object-Relational Mapping (ORM) ซึ่งเป็น abstraction ที่สูงกว่า DAL และช่วยให้เราทำงานกับฐานข้อมูลได้ในรูปแบบของ Object แทนที่จะเป็น queries โดยตรง

ORM คืออะไร?

ORM หรือ Object-Relational Mapping คือเทคนิคที่ช่วยให้เราสามารถ query และจัดการข้อมูลจากฐานข้อมูลโดยใช้แนวคิดเชิง Object-Oriented Programming (OOP) แทนที่จะเขียน SQL queries โดยตรง ORM จะทำหน้าที่แปลง (map) object ในโค้ดของเราให้เป็น record ในฐานข้อมูล และแปลง record ในฐานข้อมูลให้เป็น object ในโค้ดของเรา

พูดง่ายๆ คือ ORM ทำหน้าที่เป็นตัวกลางระหว่าง application ของเรากับฐานข้อมูล ทำให้เราไม่ต้องกังวลเรื่อง syntax ของ SQL หรือโครงสร้างของฐานข้อมูลมากนัก แต่สามารถ focus ไปที่ logic ของ application ได้มากขึ้น

ตัวอย่างการใช้งาน ORM กับ PDO

ORM ส่วนใหญ่มักจะทำงานอยู่บน PDO อีกทีหนึ่ง นั่นหมายความว่า ORM จะใช้ PDO เป็นตัวกลางในการเชื่อมต่อและสื่อสารกับฐานข้อมูล ตัวอย่าง ORM ที่ได้รับความนิยมใน PHP ได้แก่ Doctrine, Eloquent (Laravel), และ Propel

เพื่อให้เห็นภาพการทำงานของ ORM กับ PDO เราจะยกตัวอย่างการใช้งาน ORM อย่างง่าย (สมมติว่าเราสร้าง ORM ขึ้นมาเอง) เพื่อแสดงให้เห็นหลักการทำงานเบื้องหลัง:

<?php

// สมมติว่านี่คือคลาส ORM ของเรา
class SimpleORM {
    private $pdo;

    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;
    }

    public function find(string $table, int $id): ?object {
        $stmt = $this->pdo->prepare("SELECT * FROM {$table} WHERE id = :id");
        $stmt->execute(['id' => $id]);
        $result = $stmt->fetch(PDO::FETCH_OBJ);

        return $result ?: null; // คืนค่า null ถ้าไม่พบ
    }

    public function save(string $table, array $data): int {
        $columns = implode(", ", array_keys($data));
        $placeholders = ":" . implode(", :", array_keys($data));

        $sql = "INSERT INTO {$table} ({$columns}) VALUES ({$placeholders})";
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($data);

        return (int)$this->pdo->lastInsertId();
    }

    // ฟังก์ชันอื่นๆ เช่น update, delete สามารถเพิ่มได้ในลักษณะเดียวกัน
}

// ตัวอย่างการใช้งาน
try {
    $pdo = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $orm = new SimpleORM($pdo);

    // ค้นหาผู้ใช้ที่มี id = 1
    $user = $orm->find('users', 1);

    if ($user) {
        echo "User found: " . $user->name . "<br>";
    } else {
        echo "User not found.<br>";
    }

    // สร้างผู้ใช้ใหม่
    $newUserId = $orm->save('users', ['name' => 'Jane Doe', 'email' => 'jane.doe@example.com']);
    echo "New user created with ID: " . $newUserId . "<br>";

} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

ในตัวอย่างนี้ เราได้สร้างคลาส SimpleORM ซึ่งรับ instance ของ PDO เข้ามาใน constructor จากนั้น เราได้สร้างฟังก์ชัน find และ save เพื่อดึงและบันทึกข้อมูลลงในตาราง users ตามลำดับ

สังเกตว่าเรายังคงใช้ PDO ภายในคลาส SimpleORM แต่เราได้ซ่อนความซับซ้อนของการเขียน SQL queries ไว้ ทำให้โค้ดของเราอ่านง่ายขึ้นและ focus ไปที่ logic ของ application ได้มากขึ้น

ข้อควรระวัง: ตัวอย่างนี้เป็น ORM อย่างง่ายเพื่อแสดงหลักการทำงานเท่านั้น ในการใช้งานจริง เราควรใช้ ORM ที่มีอยู่แล้วซึ่งมีความสามารถที่ครอบคลุมและปลอดภัยกว่า

ข้อดีและข้อเสียของ ORM

การใช้ ORM มีข้อดีและข้อเสียที่ควรพิจารณา:

ข้อดี:

  • เพิ่ม Productivity: ORM ช่วยลดปริมาณโค้ดที่เราต้องเขียน ทำให้เราพัฒนา application ได้เร็วขึ้น
  • Code Readability: โค้ดที่ใช้ ORM มักจะอ่านง่ายกว่าโค้ดที่เขียน SQL queries โดยตรง
  • Database Abstraction: ORM ช่วยให้เราเปลี่ยนฐานข้อมูลได้ง่ายขึ้น โดยไม่ต้องแก้ไขโค้ดส่วนใหญ่ใน application
  • Security: ORM ส่วนใหญ่มีการป้องกัน SQL Injection ในตัว ทำให้ application ของเราปลอดภัยมากขึ้น
  • Maintainability: โค้ดที่ใช้ ORM มักจะ maintain ง่ายกว่าโค้ดที่เขียน SQL queries โดยตรง

ข้อเสีย:

  • Performance Overhead: ORM อาจทำให้ application ของเราทำงานช้าลงเล็กน้อย เนื่องจาก ORM ต้องแปลง object ให้เป็น SQL queries และแปลง record ให้เป็น object
  • Complexity: การเรียนรู้และใช้งาน ORM อาจต้องใช้เวลาและความพยายาม
  • Limited Control: ORM อาจจำกัดความสามารถในการปรับแต่ง SQL queries ให้เหมาะสมกับ use case บางอย่าง
  • Debugging: การ debug ปัญหาที่เกิดจาก ORM อาจทำได้ยากกว่าการ debug SQL queries โดยตรง

เหตุผลเชิงออกแบบ (Design Trade-offs)

การตัดสินใจว่าจะใช้ ORM หรือไม่นั้น ขึ้นอยู่กับปัจจัยหลายอย่าง เช่น ขนาดของ project, ความซับซ้อนของ database schema, และความเชี่ยวชาญของทีมพัฒนา

หาก project มีขนาดเล็กและ database schema ไม่ซับซ้อน การเขียน SQL queries โดยตรงอาจเป็นทางเลือกที่ดีกว่า เนื่องจากไม่ต้องเสียเวลาเรียนรู้และตั้งค่า ORM

แต่หาก project มีขนาดใหญ่และ database schema ซับซ้อน การใช้ ORM อาจช่วยลดความซับซ้อนของโค้ดและเพิ่ม productivity ได้

นอกจากนี้ ควรพิจารณาถึง performance overhead ของ ORM ด้วย หาก performance เป็นสิ่งสำคัญ อาจต้องปรับแต่ง ORM หรือเขียน SQL queries โดยตรงในบางส่วนของ application

แนวปฏิบัติที่ดี (Best Practices)

  • เลือก ORM ที่เหมาะสม: เลือก ORM ที่เหมาะสมกับ project ของเรา โดยพิจารณาจากความสามารถ, ประสิทธิภาพ, และความนิยม
  • เข้าใจการทำงานของ ORM: ศึกษาและทำความเข้าใจการทำงานของ ORM เพื่อให้สามารถใช้งานได้อย่างมีประสิทธิภาพ
  • ใช้ ORM อย่างระมัดระวัง: หลีกเลี่ยงการใช้ ORM ใน situations ที่ไม่จำเป็น เช่น การ query ข้อมูลอย่างง่าย
  • Monitor Performance: ตรวจสอบ performance ของ application อย่างสม่ำเสมอ และปรับแต่ง ORM หรือเขียน SQL queries โดยตรงหากจำเป็น
  • Keep ORM updated: อัปเดต ORM เป็นเวอร์ชันล่าสุดเสมอ เพื่อให้ได้รับ bug fixes และ security updates

ในบทถัดไป เราจะมาเรียนรู้เกี่ยวกับการป้องกัน XSS (Cross-Site Scripting) ซึ่งเป็นช่องโหว่ด้านความปลอดภัยที่พบบ่อยใน web application

Office.in.th Custom Service

ต้องการพัฒนาระบบหรือปรับแต่งจากโครงสร้างนี้?

Office.in.th รับพัฒนาและออกแบบ Enterprise Web Application, API Integration และระบบบริหารงานภาครัฐ/เอกชน พร้อมการสนับสนุนระยะยาว

ดูบริการรับพัฒนาซอฟต์แวร์