SQL Functions
\Kotchasan\Database\Sql เป็น helper class สำหรับสร้าง SQL functions ที่รองรับหลาย database
การใช้งาน
use Kotchasan\Database\Sql;
// ใน SELECT
$query = Model::createQuery()
->select('id', Sql::COUNT('*', 'total'))
->from('orders')
->groupBy('status');
// ใน WHERE
$query->where(Sql::BETWEEN('created_at', '2024-01-01', '2024-12-31'));
หมายเหตุ: ถ้าต้องการอ้างอิงคอลัมน์ในพารามิเตอร์ ให้ใช้ Sql::column('column_name') ส่วน string ธรรมดาจะถูกมองเป็นค่า literal โดยอัตโนมัติ และสามารถใช้ Sql::_strValue('N/A') เพื่อสื่อเจตนาให้ชัดเจนได้
Aggregate Functions
COUNT()
Sql::COUNT(); // COUNT(*)
Sql::COUNT('*', 'total'); // COUNT(*) as total
Sql::COUNT('id', 'cnt', true); // COUNT(DISTINCT id) as cnt
SUM() / AVG() / MIN() / MAX()
Sql::SUM('total', 'sum_total');
Sql::AVG('price', 'avg_price');
Sql::MIN('created_at', 'first_order');
Sql::MAX('created_at', 'last_order');
String Functions
CONCAT()
// CONCAT(first_name, ' ', last_name) as fullname
Sql::CONCAT(['first_name', "' '", 'last_name'], 'fullname');
// CONCAT_WS(' ', first_name, last_name)
Sql::CONCAT(['first_name', 'last_name'], 'fullname', ' ');
GROUP_CONCAT()
// GROUP_CONCAT(name SEPARATOR ', ')
Sql::GROUP_CONCAT('name', 'names', ', ');
// GROUP_CONCAT(DISTINCT name ORDER BY name)
Sql::GROUP_CONCAT('name', 'names', ',', true, 'name');
LENGTH() / UPPER() / LOWER()
Sql::LENGTH('content', 'char_count');
Sql::UPPER('name', 'name_upper');
Sql::LOWER('email', 'email_lower');
TRIM() / LTRIM() / RTRIM()
Sql::TRIM('name', 'clean_name');
Sql::LTRIM('name');
Sql::RTRIM('name');
SUBSTRING() / REPLACE()
// SUBSTRING(content, 1, 100)
Sql::SUBSTRING('content', 1, 100, 'preview');
// REPLACE(content, 'old', 'new')
Sql::REPLACE('content', 'old', 'new', 'updated');
// ใช้คอลัมน์แทนค่า literal
Sql::REPLACE('content', Sql::column('old'), 'new', 'updated');
Date Functions
NOW() / CURDATE() / CURTIME()
Sql::NOW(); // NOW()
Sql::CURDATE(); // CURDATE()
Sql::CURTIME(); // CURTIME()
DATE() / YEAR() / MONTH() / DAY()
Sql::DATE('created_at', 'date_only'); // DATE(created_at)
Sql::YEAR('created_at', 'year'); // YEAR(created_at)
Sql::MONTH('created_at', 'month'); // MONTH(created_at)
Sql::DAY('created_at', 'day'); // DAY(created_at)
// MySQL format
Sql::DATE_FORMAT('created_at', '%Y-%m-%d', 'formatted');
DATEDIFF()
// จำนวนวันระหว่าง 2 วันที่
Sql::DATEDIFF('end_date', 'start_date', 'days');
Conditional Functions
IF()
// IF(status = 1, 'Active', 'Inactive')
Sql::IF_EXPR('status = 1', "'Active'", "'Inactive'", 'status_text');
CASE
Sql::CASE_WHEN([
['status = 1', "'Active'"],
['status = 0', "'Inactive'"]
], "'Unknown'", 'status_label');
IFNULL() / COALESCE()
// IFNULL(phone, 'N/A')
Sql::IFNULL('phone', "'N/A'", 'phone');
// COALESCE(phone, mobile, 'N/A')
Sql::COALESCE(['phone', 'mobile', "'N/A'"], 'contact');
Math Functions
Sql::ABS('value');
Sql::CEIL('value');
Sql::FLOOR('value');
Sql::ROUND('value', 2);
Sql::RAND();
Comparison
BETWEEN
// price BETWEEN 100 AND 1000
Sql::BETWEEN('price', 100, 1000);
IN / NOT IN
Sql::IN('status', [1, 2, 3]);
Sql::NOT_IN('status', [0, -1]);
หมายเหตุ: ถ้า list ว่าง IN() จะคืนค่า 0=1 และ NOT_IN() จะคืนค่า 1=1 เพื่อหลีกเลี่ยง SQL ที่ไม่ถูกต้อง
DISTINCT
Sql::DISTINCT('category');
Method Reference
Aggregate
| Method |
Description |
|---|
COUNT($col, $alias, $distinct) |
นับจำนวน |
SUM($col, $alias) |
ผลรวม |
AVG($col, $alias, $distinct) |
ค่าเฉลี่ย |
MIN($col, $alias) |
ค่าน้อยสุด |
MAX($col, $alias) |
ค่ามากสุด |
String
| Method |
Description |
|---|
CONCAT($fields, $alias, $sep) |
ต่อ string |
GROUP_CONCAT($fields, $alias, $sep, $distinct, $order) |
ต่อ string ใน group |
LENGTH($col, $alias) |
ความยาว string |
UPPER($col, $alias) |
แปลงเป็นตัวพิมพ์ใหญ่ |
LOWER($col, $alias) |
แปลงเป็นตัวพิมพ์เล็ก |
TRIM($col, $alias) |
ตัดช่องว่าง |
LTRIM($col, $alias) |
ตัดช่องว่างด้านซ้าย |
RTRIM($col, $alias) |
ตัดช่องว่างด้านขวา |
SUBSTRING($col, $start, $len, $alias) |
ตัด string |
REPLACE($col, $search, $replace, $alias) |
แทนที่ string |
Date
| Method |
Description |
|---|
NOW() |
วันเวลาปัจจุบัน |
CURDATE() |
วันที่ปัจจุบัน |
CURTIME() |
เวลาปัจจุบัน |
DATE($col, $alias) |
แยกวันที่ |
YEAR($col, $alias) |
แยกปี |
MONTH($col, $alias) |
แยกเดือน |
DAY($col, $alias) |
แยกวัน |
DATE_FORMAT($col, $format, $alias) |
format วันที่ |
DATEDIFF($col1, $col2, $alias) |
ความต่างของวันที่ |
Conditional
| Method |
Description |
|---|
IF_EXPR($cond, $true, $false, $alias) |
IF condition |
CASE_WHEN($cases, $else, $alias) |
CASE expression |
IFNULL($col, $default, $alias) |
default ถ้า null |
COALESCE($values, $alias) |
ค่าแรกที่ไม่ null |
Comparison
| Method |
Description |
|---|
BETWEEN($col, $min, $max) |
ช่วงค่า |
IN($col, $values) |
อยู่ในรายการ |
NOT_IN($col, $values) |
ไม่อยู่ในรายการ |
คณิตศาสตร์
| Method |
Description |
|---|
ABS($col, $alias) |
ค่าสัมบูรณ์ |
CEIL($col, $alias) |
ปัดขึ้น |
FLOOR($col, $alias) |
ปัดลง |
ROUND($col, $precision, $alias) |
ปัดเศษตามจำนวนตำแหน่ง |
คลาสที่เกี่ยวข้อง