Kotchasan Framework Documentation

Kotchasan Framework Documentation

Database Class

TH 05 Feb 2026 06:23

Database Class

Database Class เป็นจุดเริ่มต้นหลักสำหรับการทำงานกับฐานข้อมูลใน Kotchasan Framework ให้ความสามารถในการจัดการการเชื่อมต่อ, การสร้าง Query Builder, และการจัดการ Transaction

สารบัญ

ภาพรวม

Database Class ทำหน้าที่เป็นสะพานเชื่อมระหว่างแอปพลิเคชันของคุณกับฐานข้อมูล โดยให้บริการ:

  • การจัดการการเชื่อมต่อหลายฐานข้อมูล
  • การสร้าง Query Builder สำหรับ SELECT, INSERT, UPDATE, DELETE
  • การจัดการ Transaction
  • ความสามารถในการทำ Query Caching
  • การบันทึก Log การทำงาน (Operation logging)

การติดตั้งและการตั้งค่า

การตั้งค่าฐานข้อมูล

สร้างไฟล์ settings/database.php สำหรับการตั้งค่าฐานข้อมูล:

return [
    'default' => [
        'driver' => 'mysql',
        'host' => 'localhost',
        'database' => 'kotchasan_db',
        'username' => 'root',
        'password' => '',
        'prefix' => 'app_',
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci'
    ],
    'cache' => [
        'driver' => 'mysql',
        'host' => 'localhost',
        'database' => 'cache_db',
        'username' => 'cache_user',
        'password' => 'cache_pass'
    ],
    'tables' => [
        'users' => 'members',
        'posts' => 'articles'
    ]
];

การตั้งค่าผ่าน Code

use Kotchasan\Database;

// ตั้งค่าการเชื่อมต่อฐานข้อมูล
Kotchasan\Database::config([
    'default' => [
        'driver' => 'mysql',
        'host' => 'localhost',
        'database' => 'myapp',
        'username' => 'user',
        'password' => 'pass'
    ]
]);

การใช้งานพื้นฐาน

การสร้าง Database Instance

use Kotchasan\Database;

// สร้าง instance ด้วย default connection
$db = Kotchasan\Database::create();

// สร้าง instance ด้วย connection ที่ระบุ
$cacheDb = Kotchasan\Database::create('cache');

การดึงข้อมูลอย่างง่าย

// ดึงข้อมูลทั้งหมดจากตาราง
$users = $db->all('users');

// ดึง record แรก
$user = $db->first('users');

// ดึงข้อมูลตามเงื่อนไข
$activeUsers = $db->get('users', ['status' => 'active']);

Query Builders

SELECT Query

// SELECT พื้นฐาน
$users = $db->select(['id', 'name', 'email'])
    ->from('users')
    ->where(['status' => 'active'])
    ->orderBy('name')
    ->limit(10)
    ->fetchAll();

// SELECT แบบ JOIN
$posts = $db->select(['p.title', 'u.name as author'])
    ->from('posts', 'p')
    ->leftJoin('users u', 'p.user_id = u.id')
    ->where(['p.published' => 1])
    ->fetchAll();

// SELECT แบบ Subquery
$subquery = $db->select('COUNT(*)')
    ->from('comments')
    ->where(['post_id', '=', \Kotchasan\Database\Sql::column('p.id')]);

$posts = $db->select(['title', [$subquery, 'comment_count']])
    ->from('posts', 'p')
    ->fetchAll();

INSERT Query

// Insert แถวเดียว
$result = $db->insert('users')
    ->values([
        'name' => 'John Doe',
        'email' => 'john@example.com',
        'created_at' => date('Y-m-d H:i:s')
    ])
    ->execute();

$userId = $db->lastInsertId();

// Insert หลายแถว
$db->insert('users')
    ->rows([
        ['name' => 'Alice', 'email' => 'alice@example.com'],
        ['name' => 'Bob', 'email' => 'bob@example.com']
    ])
    ->execute();

UPDATE Query

// Update ตามเงื่อนไข
$db->update('users')
    ->set([
        'last_login' => date('Y-m-d H:i:s'),
        'login_count' => \Kotchasan\Database\Sql::raw('login_count + 1')
    ])
    ->where(['id' => $userId])
    ->execute();

// Update ด้วยเงื่อนไขซับซ้อน
$db->update('posts')
    ->set(['status' => 'published'])
    ->where(['author_id' => $authorId])
    ->where(['created_at', '>=', '2024-01-01'])
    ->execute();

DELETE Query

// Delete ตามเงื่อนไข
$db->delete('users')
    ->where(['status' => 'inactive'])
    ->where(['last_login', '<', '2023-01-01'])
    ->execute();

// Delete แบบมี LIMIT
$db->delete('logs')
    ->where(['level' => 'debug'])
    ->orderBy('created_at')
    ->limit(1000)
    ->execute();

การจัดการ Transaction

Transaction พื้นฐาน

// เริ่ม transaction
$db->beginTransaction();

try {
    // ทำหลาย operations
    $db->insert('orders')
        ->values(['user_id' => $userId, 'total' => $total])
        ->execute();

    $orderId = $db->lastInsertId();

    $db->insert('order_items')
        ->values(['order_id' => $orderId, 'product_id' => $productId])
        ->execute();

    // ยืนยัน (Commit) transaction
    $db->commit();

} catch (Exception $e) {
    // ยกเลิก (Rollback) transaction
    $db->rollback();
    throw $e;
}

Transaction แบบ Callback

$result = $db->transaction(function($db) use ($userId, $productId) {
    // Operations ภายใน transaction
    $orderId = $db->insert('orders')
        ->values(['user_id' => $userId])
        ->execute();

    $db->insert('order_items')
        ->values(['order_id' => $orderId, 'product_id' => $productId])
        ->execute();

    return $orderId;
});

การจัดการ Cache

การตั้งค่า Cache

use Kotchasan\Database;

// ตั้งค่า cache ด้วย array
$queryCache = Kotchasan\Database::configureCache([
    'driver' => 'file',
    'path' => '/tmp/cache'
], 3600); // TTL 1 ชั่วโมง

// ตั้งค่า cache ด้วย Cache instance
use Kotchasan\Cache\FileCache;

$cache = new FileCache('/tmp/cache');
$queryCache = Kotchasan\Database::setCache($cache, 7200); // TTL 2 ชั่วโมง

การใช้งาน Cache

// Query จะถูก cache อัตโนมัติ
$users = $db->select('*')
    ->from('users')
    ->where(['status' => 'active'])
    ->cache(300) // Cache เป็นเวลา 5 นาที
    ->fetchAll();

เมธอดทั้งหมด

Static Methods

Method Description
create($connectionName = 'default') สร้าง Database instance
config($config) ตั้งค่า database connections
configureCache($config, $defaultTtl) ตั้งค่า query cache
setCache($cache, $defaultTtl) ตั้งค่า Cache instance
getQueryCache() ดึง QueryCache instance
setLogger($logger) ตั้งค่า Logger
getLogger() ดึง Logger instance
getConnection($connectionName) ดึง Connection instance

Instance Methods

Method Description
select($columns) สร้าง SELECT query
insert($table) สร้าง INSERT query
update($table) สร้าง UPDATE query
delete($table) สร้าง DELETE query
raw($sql, $params) รัน raw SQL
first($table, $columns) ดึงแถวแรกจากตาราง
all($table, $columns) ดึงข้อมูลทั้งหมดจากตาราง
get($table, $where, $columns) ดึงข้อมูลตามเงื่อนไข
beginTransaction() เริ่มต้น transaction
commit() ยืนยัน transaction
rollback() ยกเลิก transaction
transaction($callback) รันภายใน transaction
lastInsertId($name) ดึง ID ที่ insert ล่าสุด
getTableName($table) ดึงชื่อตารางจริงพร้อม prefix
emptyTable($table, $options) ล้างข้อมูลในตาราง
optimizeTable($table) ปรับปรุงประสิทธิภาพตาราง

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

ระบบจัดการผู้ใช้ (User Management System)

class UserManager
{
    private $db;

    public function __construct()
    {
        $this->db = Kotchasan\Database::create();
    }

    public function createUser($userData)
    {
        return $this->db->transaction(function($db) use ($userData) {
            // สร้าง user
            $userId = $db->insert('users')
                ->values([
                    'username' => $userData['username'],
                    'email' => $userData['email'],
                    'password' => password_hash($userData['password'], PASSWORD_DEFAULT),
                    'created_at' => date('Y-m-d H:i:s')
                ])
                ->execute();

            // สร้าง profile
            $db->insert('user_profiles')
                ->values([
                    'user_id' => $userId,
                    'first_name' => $userData['first_name'],
                    'last_name' => $userData['last_name']
                ])
                ->execute();

            return $userId;
        });
    }

    public function getUserWithProfile($userId)
    {
        return $this->db->select([
                'u.id', 'u.username', 'u.email',
                'p.first_name', 'p.last_name'
            ])
            ->from('users', 'u')
            ->leftJoin('user_profiles p', 'u.id = p.user_id')
            ->where(['u.id' => $userId])
            ->first();
    }

    public function getActiveUsers($limit = 10)
    {
        return $this->db->select(['id', 'username', 'email', 'last_login'])
            ->from('users')
            ->where(['status' => 'active'])
            ->orderBy('last_login', 'DESC')
            ->limit($limit)
            ->cache(300) // Cache 5 นาที
            ->fetchAll();
    }
}

ระบบจัดการบล็อก (Blog Management System)

class BlogManager
{
    private $db;

    public function __construct()
    {
        $this->db = Kotchasan\Database::create();
    }

    public function getPostsWithCommentCount($page = 1, $perPage = 10)
    {
        $offset = ($page - 1) * $perPage;

        // Subquery สำหรับนับ comment
        $commentCount = $this->db->select('COUNT(*)')
            ->from('comments')
            ->where(['post_id', '=', \Kotchasan\Database\Sql::column('p.id')])
            ->where(['status' => 'approved']);

        return $this->db->select([
                'p.id', 'p.title', 'p.content', 'p.created_at',
                'u.username as author',
                [$commentCount, 'comment_count']
            ])
            ->from('posts', 'p')
            ->leftJoin('users u', 'p.author_id = u.id')
            ->where(['p.status' => 'published'])
            ->orderBy('p.created_at', 'DESC')
            ->limit($perPage, $offset)
            ->fetchAll();
    }

    public function publishPost($postId, $authorId)
    {
        return $this->db->transaction(function($db) use ($postId, $authorId) {
            // ตรวจสอบสิทธิ์
            $post = $db->select('author_id')
                ->from('posts')
                ->where(['id' => $postId])
                ->first();

            if (!$post || $post->author_id != $authorId) {
                throw new Exception('Unauthorized');
            }

            // อัพเดทสถานะ
            $db->update('posts')
                ->set([
                    'status' => 'published',
                    'published_at' => date('Y-m-d H:i:s')
                ])
                ->where(['id' => $postId])
                ->execute();

            // บันทึกกิจกรรม
            $db->insert('activity_log')
                ->values([
                    'user_id' => $authorId,
                    'action' => 'post_published',
                    'target_id' => $postId,
                    'created_at' => date('Y-m-d H:i:s')
                ])
                ->execute();

            return true;
        });
    }
}

การจัดการ Error

class DatabaseErrorHandler
{
    private $db;

    public function __construct()
    {
        $this->db = Kotchasan\Database::create();

        // ตั้งค่า logger
        $logger = new FileLogger('/var/log/database.log');
        Kotchasan\Database::setLogger($logger);
    }

    public function safeInsert($table, $data)
    {
        try {
            $result = $this->db->insert($table)
                ->values($data)
                ->execute();

            if (!$result) {
                $error = $this->db->getLastError();
                throw new Exception("Insert failed: {$error}");
            }

            return $this->db->lastInsertId();

        } catch (Exception $e) {
            // Log error
            error_log("Kotchasan\Database error: " . $e->getMessage());

            // Re-throw exception
            throw $e;
        }
    }

    public function getLastQuery()
    {
        return $this->db->getLastQuery();
}
}

ข้อควรทราบ

  1. การตั้งค่าฐานข้อมูล: ควรกำหนดใน settings/database.php เพื่อความปลอดภัย
  2. Transactions: ใช้กับงานที่ต้องการความถูกต้องของข้อมูล
  3. Caching: ใช้กับ query ที่ข้อมูลไม่เปลี่ยนบ่อย
  4. Error Handling: ควรใช้ try-catch และบันทึก log
  5. Performance: ใช้ index และ LIMIT เมื่อจำเป็น

คลาสที่เกี่ยวข้อง

  • DB - Utility class สำหรับงานฐานข้อมูลง่ายๆ
  • QueryBuilder - ตัวสร้างคำสั่ง SQL
  • Connection - การจัดการการเชื่อมต่อฐานข้อมูล
  • Cache - ระบบ query cache