Kotchasan PHP Framework

การใช้งาน Recordset

Recordset เป็นวิธีการใช้งานฐานข้อมูลอีกรูปแบบหนึ่งของคชสาร สามารถเทียบเคียงได้กับ ORM (Object-relational mapping) หรือ ActiveRecord ของเฟรมเวิร์คอื่น ซึ่งหลักการของ Recordset คือการมองฐานข้อมูลเป็นคลาสหรืออ๊อปเจ็คหนึ่ง ซึ่งจะทำให้การใช้งานฐานข้อมูลง่ายเหมือนกับการใช้งานคลาสธรรมดา โดยไม่จำเป็นต้องไปยุ่งยากกับ SQL หรือจดจำคำสั่งของ SQL อีกต่อไป ยกตัวอย่างเช่น
// 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
เวลาที่จะเรียกใช้งานโมเดลต้องสร้าง Recordset เพื่ออ้างถึงโมเดล
$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);
}