Kotchasan PHP Framework

โปรเจ็ค recordset ใช้งานฐานข้อมูลด้วย Recordset

โปรเจ็คนี้เป็นตัวอย่างการใช้งานฐานข้อมูลด้วย Recordset หรือที่เรียกกันติดปากว่า ORM (Object Relational Mapping)
        
  • recordset/     
              
    1. modules/         
                    
      1. index/             
                          
        1. models/                 
                                
          1. world.php Index\World\Model คลาสของฐานข้อมูล
          2.                 
                          
        2.                 
        3. controllers/                 
                                
          1. index.php Index\Index\Controller
          2.                 
                          
        4.             
                    
      2.         
              
    2.         
    3. settings/         
                    
      1. database.php ค่ากำหนดในการเชื่อมต่อฐานข้อมูล
      2.         
              
    4.         
    5. index.php
    6.     
        

โปรเจ็คนี้มีการใช้งานฐานข้อมูลร่วมด้วย ดังนั้นก่อนเรียกโปรเจ็คต้องสร้างฐานข้อมูลกันก่อน
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>';