การใช้งาน Recordset
Recordset เป็นวิธีการใช้งานฐานข้อมูลอีกรูปแบบหนึ่งของคชสาร สามารถเทียบเคียงได้กับ ORM (Object-relational mapping) หรือ ActiveRecord ของเฟรมเวิร์คอื่น ซึ่งหลักการของ Recordset คือการมองฐานข้อมูลเป็นคลาสหรืออ๊อปเจ็คหนึ่ง ซึ่งจะทำให้การใช้งานฐานข้อมูลง่ายเหมือนกับการใช้งานคลาสธรรมดา โดยไม่จำเป็นต้องไปยุ่งยากกับ SQL หรือจดจำคำสั่งของ SQL อีกต่อไป ยกตัวอย่างเช่น
ก่อนการใช้งาน ต้องมีการสร้าง Recordset ก่อนโดยการสร้าง Model
โมเดลของ Recordset จะสืบทอดมาจาก Kotchasan\Orm\Field ซึ่งถือเป็นตัวแทนของข้อมูล 1 รายการ และมี Property ที่สำคัญอยู่ 2 ตัว
การค้นหาข้อมูลด้วย find()
การค้นหาข้อมูลด้วย where() คืนค่าผลลัพท์รายการเดียว
การค้นหาข้อมูลด้วย where() ที่ให้ผลลัพท์หลายรายการ
ผลลัพท์
การอัปเดทข้อมูล ใช้เมธอด save()
การเพิ่มข้อมูลใหม่ ใช้เมธอด save() กับข้อมูลที่เพิ่งสร้าง
การอัปเดทข้อมูลทุกรายการในครั้งเดียว ด้วย updateAll()
การนับจำนวนเร็คคอร์ด ด้วย count()
ลบข้อมูลทั้งหมดในตารางเพื่อเริ่มต้นใหม่ ด้วย emptyTable()
การค้นหาข้อมูลที่มีการเรียงลำดับและจำกัดผลลัพท์
// create Recordset
$rs = Recordset::create('Index\World\Model');
// SELECT * FROM world WHERE id = 100
$result = $rs->find(100);
var_dump($result);
ก่อนการใช้งาน ต้องมีการสร้าง Recordset ก่อนโดยการสร้าง Model
namespace Index\World;
class Model extends \Kotchasan\Orm\Field
{
/**
* ชื่อของการเชื่อมต่อ ใช้สำหรับโหลด config จาก settings/database.php
*
* @var string
*/
protected $conn = 'mysql';
/**
* ชื่อตาราง
*
* @var string
*/
protected $table = 'world';
}
โมเดลของ Recordset จะสืบทอดมาจาก Kotchasan\Orm\Field ซึ่งถือเป็นตัวแทนของข้อมูล 1 รายการ และมี Property ที่สำคัญอยู่ 2 ตัว
- $conn ใช้สำหรับกำหนดค่าการเชื่อมต่อ ซึ่ง Property นี้จะไม่ระบุก็ได้ ซึ่งถ้าไม่ระบุจะเป็นการใช้การเชื่อมต่อเริ่มต้น คือ mysql
- $table ใช้สำหรับกำหนดชื่อตารางที่โมเดลนี้เชื่อมต่ออยู่ สามารถระบุชื่อพร้อม Alias ที่ต้องการได้เช่น $table = 'world W' ซึ่งเมื่อแปลงเป็นชื่อตารางแล้วจะได้ว่า `prefix_world` AS W
$rs = Recordset::create('Index\World\Model');
การค้นหาข้อมูลด้วย find()
// SELECT * FROM `gcms_plus`.`world` AS world WHERE `world`.`id` = 1
$result = $rs->find(1);
var_dump($result);
การค้นหาข้อมูลด้วย where() คืนค่าผลลัพท์รายการเดียว
// SELECT `id`, `created_at` FROM `gcms_plus`.`world` AS world WHERE `world`.`id` = 1 LIMIT 1
$search = $rs->where($id)->first('id', 'created_at');
echo $search->id.'='.$search->created_at;
การค้นหาข้อมูลด้วย where() ที่ให้ผลลัพท์หลายรายการ
// SELECT `id`, `created_at` FROM `gcms_plus`.`world` AS world WHERE `id` IN (1, 2, 3)
$query = $rs->where(array('id', array(1, 2, 3)));
foreach ($query->execute('id', 'created_at') as $item) {
echo $item->id.'='.$item->created_at;
}
ผลลัพท์
1=2016-09-16 19:28:41
2=2016-09-16 19:28:42
3=2016-09-16 19:28:43
การอัปเดทข้อมูล ใช้เมธอด save()
// SELECT `id`, `created_at` FROM `gcms_plus`.`world` AS world WHERE `id` IN (1, 2, 3)
$query = $rs->where(array('id', array(1, 2, 3)));
foreach ($query->execute('id', 'created_at') as $item) {
// แก้ไขข้อมูลเป็นวันนี้
$item->created_at = date('Y-m-d H:i:s');
// UPDATE `gcms_plus`.`world` SET `id` = 1, `created_at` = '2016-09-14 20:41:36' WHERE `id` = 1
$item->save();
}
การเพิ่มข้อมูลใหม่ ใช้เมธอด save() กับข้อมูลที่เพิ่งสร้าง
$row = \Index\World\Model::create();
$row->created_at = date('Y-m-d H:i:s');
// INSERT INTO `gcms_plus`.`world` (`created_at`) VALUES ('2016-09-14 20:41:36')
// คืนค่า id ของรายการที่เพิ่มใหม่
echo $row->save();
การอัปเดทข้อมูลทุกรายการในครั้งเดียว ด้วย updateAll()
// UPDATE `gcms_plus`.`world` SET `created_at` = '2016-09-14 20:41:36'
$rs->updateAll(array(
'created_at' => date('Y-m-d H:i:s')
));
การนับจำนวนเร็คคอร์ด ด้วย count()
// SELECT COUNT(*) AS `count` FROM `gcms_plus`.`world` AS world
$count = $rs->count();
ลบข้อมูลทั้งหมดในตารางเพื่อเริ่มต้นใหม่ ด้วย emptyTable()
// TRUNCATE TABLE `gcms_plus`.`world`
$rs->emptyTable();
การค้นหาข้อมูลที่มีการเรียงลำดับและจำกัดผลลัพท์
$query = $rs->where(array(
array('MONTH(created_at)', 9),
array('DAY(created_at)', 16)
));
/*
SELECT COUNT(*) AS `count` FROM `gcms_plus`.`world` AS world
WHERE MONTH(created_at) = 9 AND DAY(created_at) = 16
*/
echo 'พบข้อมูลทั้งหมด '.$query->count().' เร็คคอร์ด';
/*
SELECT * FROM `gcms_plus`.`world` AS world
WHERE MONTH(created_at) = 9 AND DAY(created_at) = 16
ORDER BY `id` DESC LIMIT 5,10
*/
foreach ($query->take(5, 10)->order('id DESC')->execute() as $item) {
print_r($item);
}