Kotchasan Framework Documentation

Kotchasan Framework Documentation

Model Class - Database Operations

TH 05 Feb 2026 07:40

Model Class - Database Operations

\Kotchasan\Model เป็น Base Class สำหรับ Model ทั้งหมด มี createQuery() method ที่ให้ QueryBuilder สำหรับสร้าง queries ที่ซับซ้อน

การสร้าง Model

namespace Index\Profile;

class Model extends \Kotchasan\Model
{
    // Methods ของ Model
}

static::createQuery() - QueryBuilder

ใช้สำหรับสร้าง SELECT, INSERT, UPDATE, DELETE queries แบบ fluent interface

SELECT - ดึงข้อมูล

จาก [profile.php] - ดึง 1 record:

public static function get($id)
{
    return static::createQuery()
        ->select()
        ->from('user')
        ->where([['id', $id]])
        ->first();
}

จาก [profile.php] - เลือก columns:

public static function view($id)
{
    return static::createQuery()
        ->select('U.*')
        ->from('user U')
        ->where([['U.id', $id]])
        ->first();
}

จาก [users.php] - Query for DataTable:

public static function toDataTable($params)
{
    // Filters (AND conditions)
    $where = [];
    if (isset($params['status']) && $params['status'] !== '') {
        $where[] = ['U.status', (int) $params['status']];
    }

    // สร้าง query
    $query = static::createQuery()
        ->select(
            'U.id',
            'U.username',
            'U.name',
            'U.phone',
            'U.status',
            'U.active',
            'U.social',
            'U.create_date'
        )
        ->from('user U')
        ->where($where);

    // Search (OR condition)
    if (!empty($params['search'])) {
        $search = '%'.$params['search'].'%';
        $where = [
            ['U.name', 'LIKE', $search],
            ['U.username', 'LIKE', $search],
            ['U.phone', 'LIKE', $search]
        ];
        $query->where($where, 'OR');
    }

    return $query;
}

จาก [users.php] - สำหรับ dropdown/select:

public static function toOptions($where = [])
{
    return static::createQuery()
        ->select('id value', 'name text')
        ->from('user')
        ->where($where)
        ->orderBy('name')
        ->execute()
        ->fetchAll();
}

จาก [category.php] - ดึงและประมวลผล:

public static function get($type)
{
    $query = static::createQuery()
        ->select('category_id', 'topic', 'language')
        ->from('category')
        ->where([['type', $type]])
        ->execute();

    $data = [];
    foreach ($query->fetchAll() as $item) {
        if (!isset($data[$item->category_id])) {
            $data[$item->category_id]['id'] = $item->category_id;
        }
        $data[$item->category_id][$item->language] = $item->topic;
    }

    return array_values($data);
}

SELECT - With Activation Check

จาก [register.php]:

$user = static::createQuery()
    ->select('id', 'activatecode', 'active')
    ->from('user')
    ->where([['id', $userId]])
    ->first();

จาก [register.php]:

$user = static::createQuery()
    ->select('id', 'username', 'name', 'active', 'activatecode')
    ->from('user')
    ->where([['activatecode', $code]])
    ->first();

QueryBuilder Methods

Method Description Return
select(...$columns) กำหนด columns ที่ต้องการ QueryBuilder
from($table) กำหนดตาราง QueryBuilder
where($conditions, $operator) เงื่อนไข ($operator = 'AND' หรือ 'OR') QueryBuilder
orderBy($column, $direction) เรียงลำดับ QueryBuilder
limit($limit, $offset) จำกัดจำนวน QueryBuilder
first() ดึง record แรก object|null
execute() Execute query ResultInterface
fetchAll() ดึงผลลัพธ์ทั้งหมด array

Where Conditions

// 1. แบบง่าย: [['field', 'value']]
->where([['id', 1]])

// 2. หลายเงื่อนไข (AND)
->where([
    ['status', 1],
    ['active', 1]
])

// 3. ใช้ operator
->where([
    ['U.name', 'LIKE', '%search%'],
    ['price', '>', 100]
])

// 4. OR conditions
->where($conditions, 'OR')

Table Alias

static::createQuery()
    ->select('U.id', 'U.name', 'P.title')
    ->from('user U')
    ->where([['U.id', $id]])
    ->first();

Model vs DB Utility

Feature static::createQuery() \Kotchasan\DB::create()
Use case Complex queries, JOINs Simple CRUD
Syntax Fluent chain Method call
Flexibility สูง ปานกลาง
ใช้ใน Model classes ทุกที่

ตัวอย่างความแตกต่าง:

// Model::createQuery() - สำหรับ complex queries
$users = static::createQuery()
    ->select('U.*', 'R.name role')
    ->from('user U')
    ->leftJoin('roles R', [['R.id', 'U.role_id']])
    ->where([['U.status', 1]])
    ->orderBy('U.name')
    ->execute()
    ->fetchAll();

// DB::create() - สำหรับ simple CRUD
$user = \Kotchasan\DB::create()->first('user', [['id', $id]]);

Model Method Reference

Static Methods

Method Signature Return
createQuery createQuery() QueryBuilderInterface
create create() static - Model instance
createDb createDb() Database

Instance Methods

Method Signature Return
select select(...$columns) SelectBuilder
insert insert(string $table) InsertBuilder
update update(string $table) UpdateBuilder
delete delete(string $table) DeleteBuilder
raw raw(string $sql, array $params) mixed
lastInsertId lastInsertId() int\|string
getDB getDB() Database
getTableName getTableName(string $table) string
getPrefix getPrefix() string
beginTransaction beginTransaction() bool
commit commit() bool
rollback rollback() bool

Instance Methods Usage

Model::create() - สร้าง Model Instance

$model = \Index\Users\Model::create();
$db = $model->getDB();

Instance select/insert/update/delete

$model = new \Kotchasan\Model();

// Instance-level query builders
$selectBuilder = $model->select('id', 'name')->from('user');
$insertBuilder = $model->insert('user')->values([...]);
$updateBuilder = $model->update('user')->set([...])->where([...]);
$deleteBuilder = $model->delete('user')->where([...]);

raw() - รัน SQL โดยตรง

$model = new \Kotchasan\Model();
$result = $model->raw(
    'SELECT * FROM {prefix}user WHERE status = :status',
    [':status' => 1]
);

Transaction ใน Model

class OrderModel extends \Kotchasan\Model
{
    public function createOrder($data, $items)
    {
        try {
            $this->beginTransaction();

            $this->insert('orders')
                ->values($data)
                ->execute();
            $orderId = $this->db->lastInsertId();

            foreach ($items as $item) {
                $item['order_id'] = $orderId;
                $this->insert('order_items')
                    ->values($item)
                    ->execute();
            }

            $this->commit();
            return $orderId;

        } catch (\Exception $e) {
            $this->rollback();
            throw $e;
        }
    }
}

getTableName() / getPrefix()

$model = new \Kotchasan\Model();

// ได้ชื่อตารางพร้อม prefix เช่น "app_user"
$tableName = $model->getTableName('user');

// ได้ prefix เช่น "app"
$prefix = $model->getPrefix();

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

  • DB - Utility class สำหรับ simple CRUD
  • QueryBuilder - QueryBuilder documentation