Kotchasan Framework Documentation

Kotchasan Framework Documentation

Kotchasan\QueryBuilder\SelectBuilder

TH 05 Feb 2026 06:23

Kotchasan\QueryBuilder\SelectBuilder

SelectBuilder สร้างคำสั่ง SELECT ด้วย fluent interface

การใช้งาน

use Kotchasan\Database;

$db = Database::create();

// SELECT พื้นฐาน
$users = $db->select('*')
    ->from('users')
    ->fetchAll();

// SELECT พร้อมเงื่อนไข
$users = $db->select('id', 'name', 'email')
    ->from('users')
    ->where(['status', 'active'])
    ->orderBy('name')
    ->limit(10)
    ->fetchAll();

เมธอดหลัก

select()

->select('*')                    // ทุกคอลัมน์
->select('id', 'name', 'email')  // บางคอลัมน์
->select(['id', 'name'])         // แบบ array

from()

->from('users')
->from('users U')

distinct()

->distinct()  // SELECT DISTINCT

where() / orWhere()

->where(['status', 'active'])
->where(['age', '>', 18])
->orWhere(['role', 'admin'])

join() / leftJoin() / rightJoin()

->join('orders O', 'users.id = O.user_id')
->leftJoin('profiles P', 'users.id = P.user_id')
->rightJoin('addresses A', 'users.id = A.user_id')

groupBy() / having()

->groupBy('category')
->having('COUNT(*)', '>', 5)

orderBy()

->orderBy('name')
->orderBy('created_at', 'DESC')

limit()

->limit(10)
->limit(10, 20)

ตัวอย่าง

Query แบบซับซ้อน

use Kotchasan\Database;

$products = $db->select('p.id', 'p.name', 'c.name AS category', 'COUNT(o.id) AS order_count')
    ->from('products p')
    ->leftJoin('categories c', 'p.category_id = c.id')
    ->leftJoin('order_items o', 'p.id = o.product_id')
    ->where(['p.status', 'active'])
    ->groupBy('p.id')
    ->having('order_count', '>', 10)
    ->orderBy('order_count', 'DESC')
    ->limit(20)
    ->fetchAll();

Subquery ใน SELECT

use Kotchasan\Database;
use Kotchasan\Database\Sql;

$subquery = $db->select('user_id', [Sql::SUM('amount'), 'total'])
    ->from('orders')
    ->groupBy('user_id');

$users = $db->select('u.name', [$subquery, 'total'])
    ->from('users u')
    ->fetchAll();

การดู SQL (Debugging)

// สร้าง SQL โดยไม่ execute
$conn = new \Kotchasan\Connection\Connection(new \Kotchasan\Connection\MySQLDriver());
$qb = new \Kotchasan\QueryBuilder\SelectBuilder($conn);
$sql = $qb->select('*')
    ->from('users')
    ->where(['status', 1])
    ->toSql();

// ผลลัพธ์: SELECT * FROM `users` WHERE (`status` = :qb_p0)

ข้อควรระวัง

  • อย่าส่ง input ผู้ใช้เข้า raw SQL โดยตรง
  • ใช้ parameter binding แทนการต่อ string
  • ใช้ Sql::column() เมื่อจำเป็นต้องอ้างอิงคอลัมน์

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