Kotchasan Framework Documentation
Database Class
Database Class
Database Class เป็นจุดเริ่มต้นหลักสำหรับการทำงานกับฐานข้อมูลใน Kotchasan Framework ให้ความสามารถในการจัดการการเชื่อมต่อ, การสร้าง Query Builder, และการจัดการ Transaction
สารบัญ
- ภาพรวม
- การติดตั้งและการตั้งค่า
- การใช้งานพื้นฐาน
- Query Builders
- การจัดการ Transaction
- การจัดการ Cache
- เมธอดทั้งหมด
- ตัวอย่างการใช้งาน
- ข้อควรทราบ
- คลาสที่เกี่ยวข้อง
- การเตรียมใช้งาน
- คุณสมบัติหลัก
- ตัวอย่างขั้นสูง
- เอกสารอ้างอิง API
- ข้อควรระวัง / ข้อผิดพลาดที่พบบ่อย
- แหล่งข้อมูลเพิ่มเติม
ภาพรวม
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();
}
}ข้อควรทราบ
- การตั้งค่าฐานข้อมูล: ควรกำหนดใน
settings/database.phpเพื่อความปลอดภัย - Transactions: ใช้กับงานที่ต้องการความถูกต้องของข้อมูล
- Caching: ใช้กับ query ที่ข้อมูลไม่เปลี่ยนบ่อย
- Error Handling: ควรใช้ try-catch และบันทึก log
- Performance: ใช้ index และ LIMIT เมื่อจำเป็น
คลาสที่เกี่ยวข้อง
- DB - Utility class สำหรับงานฐานข้อมูลง่ายๆ
- QueryBuilder - ตัวสร้างคำสั่ง SQL
- Connection - การจัดการการเชื่อมต่อฐานข้อมูล
- Cache - ระบบ query cache