โปรเจ็ค recordset ใช้งานฐานข้อมูลด้วย Recordset
โปรเจ็คนี้เป็นตัวอย่างการใช้งานฐานข้อมูลด้วย Recordset หรือที่เรียกกันติดปากว่า ORM (Object Relational Mapping)
โปรเจ็คนี้มีการใช้งานฐานข้อมูลร่วมด้วย ดังนั้นก่อนเรียกโปรเจ็คต้องสร้างฐานข้อมูลกันก่อน
เสร็จแล้วมากำหนดค่า settings/database.php
เปลี่ยน username password และ dbname เป็นของฐานข้อมูลที่ใช้ในการทดสอบ
คลาส Index\World\Model เป็น Model ในตัวอย่างนี้มันทำหน้าที่เชื่อมต่อกับฐานข้อมูล world เพียงอย่างเดียว
Index\Index\Controller หรือคอนโทรเลอร์หลักซึ่งถูกเรียกใช้งานเมื่อมีการเรียกหน้าเว็บ
คำสั่งแรกเป็นการสร้าง Recordset จากโมเดล World
คำสั่งอ่านรายชื่อฟิลด์ของตาราง world ออกมาแสดงผล
ลบข้อมูลทั้งหมดในตาราง (ไม่ลบตาราง)
แทรกข้อมูลใหม่ลงในตารางจำนวน 10000 รายการ โดยกำหนดค่าฟิลด์ updated_at เป็นวันที่ปัจจุบัน
อัปเดทข้อมูลทุกรายการ ให้ฟิลด์ created_at เป็นวันที่ปัจจุบัน
อ่านจำนวนข้อมูลทั้งหมด
สุ่มข้อมูลขึ้นมาแก้ไขจำนวน 5 รายการ
ค้นหาข้อมูลที่มีการแก้ไขและ แสดงรายการที่พบ จำนวนที่พบ และลบออกจากฐานข้อมูล
แสดงรายชื่อฟิลด์จากการ Query ครั้งล่าสุด
สุดท้ายแสดงจำนวนข้อมูลที่เหลือหลังจากการลบแล้ว
- recordset/
- modules/
- index/
- models/
- world.php Index\World\Model คลาสของฐานข้อมูล
- controllers/
- index.php Index\Index\Controller
- settings/
- database.php ค่ากำหนดในการเชื่อมต่อฐานข้อมูล
- index.php
โปรเจ็คนี้มีการใช้งานฐานข้อมูลร่วมด้วย ดังนั้นก่อนเรียกโปรเจ็คต้องสร้างฐานข้อมูลกันก่อน
CREATE TABLE IF NOT EXISTS `world` (
`id` int(11) NOT NULL,
`name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`updated_at` datetime NOT NULL,
`created_at` datetime NOT NULL,
`user_id` int(11) NOT NULL,
`randomNumber` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
เสร็จแล้วมากำหนดค่า settings/database.php
<?php
/* settings/database.php */
return array(
'mysql' => array(
'dbdriver' => 'mysql',
'username' => 'plus',
'password' => '1234',
'dbname' => 'gcms_plus'
),
'tables' => array(
)
);
เปลี่ยน username password และ dbname เป็นของฐานข้อมูลที่ใช้ในการทดสอบ
คลาส Index\World\Model เป็น Model ในตัวอย่างนี้มันทำหน้าที่เชื่อมต่อกับฐานข้อมูล world เพียงอย่างเดียว
<?php
/*
* @filesource index/models/world.php
* @link http://www.kotchasan.com/
* @copyright 2016 Goragod.com
* @license http://www.kotchasan.com/license/
*/
namespace Index\World;
/**
* คลาสสำหรับเชื่อมต่อกับฐานข้อมูลของ GCMS
*
* @author Goragod Wiriya <admin@goragod.com>
*
* @since 1.0
*/
class Model extends \Kotchasan\Orm\Field
{
/**
* ชื่อตาราง
*
* @var string
*/
protected $table = 'world';
}
Index\Index\Controller หรือคอนโทรเลอร์หลักซึ่งถูกเรียกใช้งานเมื่อมีการเรียกหน้าเว็บ
<?php
/*
* @filesource index/controllers/index.php
* @link http://www.kotchasan.com/
* @copyright 2016 Goragod.com
* @license http://www.kotchasan.com/license/
*/
namespace Index\Index;
use \Kotchasan\Http\Request;
use \Index\World\Model as World;
use \Kotchasan\Date;
use \Kotchasan\Orm\Recordset;
/**
* default Controller
*
* @author Goragod Wiriya <admin@goragod.com>
*
* @since 1.0
*/
class Controller extends \Kotchasan\Controller
{
/**
* แสดงผล
*
* @param Request $request
*/
public function index(Request $request)
{
// อ่านรายชื่อฟิลด์ของตาราง
$rs = Recordset::create('Index\World\Model');
$fields = $rs->getFields();
echo implode(', ', array_keys($fields)).'<br>';
// ลบข้อมูลทั้งตาราง
$rs->emptyTable();
// insert new record
for ($i = 0; $i < 10000; $i++) {
$query = World::create();
$query->updated_at = Date::mktimeToSqlDateTime();
$query->save();
}
// อัปเดททุก record
$rs->updateAll(array('created_at' => Date::mktimeToSqlDateTime()));
// อ่านจำนวนข้อมูลทั้งหมดในตาราง
echo 'All '.$rs->count().' records.<br>';
// สุ่ม record มาแก้ไข
for ($i = 0; $i < 5; $i++) {
$rnd = rand(1, 10000);
$world = $rs->find($rnd);
$world->name = 'Hello World!';
$world->save();
}
// query รายการที่มีการแก้ไข
$rs->where(array('name', '!=', ''));
// อ่านจำนวนข้อมูลที่พบ
echo 'Found '.$rs->count().' records.<br>';
// แสดงผลรายการที่พบ
foreach ($rs->all('id', 'name') as $item) {
echo $item->id.'='.$item->name.'<br>';
// ลบรายการที่กำลังแสดงผล
$item->delete();
}
// อ่านรายชื่อฟิลด์ของ query
$fields = $rs->getFields();
echo implode(', ', array_keys($fields)).'<br>';
// อ่านจำนวนข้อมูลที่เหลือ
echo 'Remain '.Recordset::create('Index\World\Model')->count().' records.<br>';
}
}
คำสั่งแรกเป็นการสร้าง Recordset จากโมเดล World
$rs = Recordset::create('Index\World\Model');
คำสั่งอ่านรายชื่อฟิลด์ของตาราง world ออกมาแสดงผล
$fields = $rs->getFields();
echo implode(', ', array_keys($fields)).'<br>';
ลบข้อมูลทั้งหมดในตาราง (ไม่ลบตาราง)
$rs->truncate();
แทรกข้อมูลใหม่ลงในตารางจำนวน 10000 รายการ โดยกำหนดค่าฟิลด์ updated_at เป็นวันที่ปัจจุบัน
for ($i = 0; $i < 10000; $i++) {
// สร้างรายการใหม่
$query = World::create();
// กำหนด updated_at เป็นวันที่ปัจจุบัน
$query->updated_at = Date::mktimeToSqlDateTime();
// บันทึกรายการใหม่ลงฐานข้อมูล
$query->save();
}
อัปเดทข้อมูลทุกรายการ ให้ฟิลด์ created_at เป็นวันที่ปัจจุบัน
$rs->updateAll(array('created_at' => Date::mktimeToSqlDateTime()));
อ่านจำนวนข้อมูลทั้งหมด
echo 'All '.$rs->count().' records.<br>';
สุ่มข้อมูลขึ้นมาแก้ไขจำนวน 5 รายการ
for ($i = 0; $i < 5; $i++) {
// สุ่มตัวเลข 1 ถึง 10000
$rnd = rand(1, 10000);
// ค้นหาข้อมูลที่ id = $rnd
$world = $rs->find($rnd);
// แก้ไขฟิลด์ name ของรายการที่เจอ
$world->name = 'Hello World!';
// บันทึกลงในฐานข้อมูล
$world->save();
}
ค้นหาข้อมูลที่มีการแก้ไขและ แสดงรายการที่พบ จำนวนที่พบ และลบออกจากฐานข้อมูล
$rs->where(array('name', '!=', ''));
echo 'Found '.$rs->count().' records.<br>';
// เลือกรายการที่พบออกมา เฉพาะฟิลด์ id และ name เท่านั้น
foreach ($rs->all('id', 'name') as $item) {
// แสดงผลรายการที่พบ
echo $item->id.'='.$item->name.'<br>';
// ลบรายการที่กำลังแสดงผลออกจากฐานข้อมูล
$item->delete();
}
แสดงรายชื่อฟิลด์จากการ Query ครั้งล่าสุด
$fields = $rs->getFields();
echo implode(', ', array_keys($fields)).'<br>';
สุดท้ายแสดงจำนวนข้อมูลที่เหลือหลังจากการลบแล้ว
echo 'Remain '.Recordset::create('Index\World\Model')->count().' records.<br>';