Warning: file_get_contents(/home/gcms/public_html/skin/datas/users/kotchasan/skin/kotchasan/amp.css): failed to open stream: No such file or directory in /home/gcms/public_html/Gcms/Amp.php on line 32
การใช้งาน CRUD

Kotchasan PHP Framework

การใช้งาน CRUD

ก่อนการใช้งานฐานข้อมูลทุกครั้งเราจะต้องมีการเชื่อมต่อกับฐานข้อมูลกันก่อน ซึ่งวิธีอย่างง่ายในการเชื่อมต่อกับฐานข้อมูลคือเรียกใช้โมเดล
// เริ่มต้นใช้งานฐานข้อมูล (Model)
$model = new \Kotchasan\Model;

ซึ่งการเชื่อมต่อกับฐานข้อมูลจะเกิดขึ้นโดยอัตโนมัติเมื่อมีการสร้างโมเดล

การร้องขอข้อมูลจากฐานข้อมูล พื้นฐานจะใช้คำสั่ง $model->db()->customQuery() ซึ่งจะเป็นการประมวลผลคำสั่ง SQL โดยตรง

ตัวอย่างการ query ข้อมูลจากฐานข้อมูล
// SELECT * FROM world LIMIT 1
$result = $model->db()->customQuery('SELECT * FROM world LIMIT 1');
// แสดงผลลัพท์
var_dump($result);
ในกรณีที่มีการกำหนด prefix และ ชื่อตารางไว้ (ที่ settings/database.php) การอ่านชื่อตารางมาใช้งานต้องเรียกผ่าน $model->getTableName() หรือ $model->getFullTableName() จึงจะได้ชื่อตารางที่ถูกต้อง
ซึ่งผลลัพท์ที่ได้จะอยู่ในรูปแอเรย์ของอ๊อปเจ็ค
// SELECT * FROM world ORDER BY id DESC LIMIT 5
foreach ($model->db()->customQuery('SELECT * FROM world ORDER BY id DESC LIMIT 5') as $item) {
  echo $item->id.'<br>';
}

ในกรณีที่ต้องการผลลัพท์เป็นแอเรย์ให้ระบุพารามิเตอร์ตัวที่ 2 เป็น true
// SELECT * FROM world ORDER BY id DESC LIMIT 5
foreach ($model->db()->customQuery('SELECT * FROM world ORDER BY id DESC LIMIT 5', true) as $item) {
  echo $item['id'].'<br>';
}

ในกรณีที่ต้องการ Query แบบที่ไม่ต้องการผลลัพท์ตอบกลับ เราจะ Query ผ่านเมธอด $model->db()->query() ซึ่งเมธอดนี้จะตอบกลับแค่สำเร็จหรือไม่แค่นั้น (True หรือ False) โดยทั่วๆไปจะใช้คำสั่งนี้ในการสร้างตาราง หรือการลบข้อมูล หรือ อัปเดทข้อมูล เป็นต้น
// DELETE FROM world WHERE id=1000
$model->db()->query('DELETE FROM world WHERE id=:id', array(':id' => 1000));

ทั้ง customQuery และ query ใช้ในการประมวลผลคำสั่ง SQL โดยใช้ความสามารถของฐานข้อมูลโดยตรง ดังนั้นมันจึงสามารถทำได้ทุกอย่างที่ฐานข้อมูลที่ใช้งานอยู่ สามารถทำได้

การค้นหาข้อมูล
วิธีแรกเป็นการค้นหาตามรูปแบบของ PDO โดยใช้ customQuery โดยมีการแยกพารามิเตอร์ที่จะค้นหาใส่ลงในพารามิเตอร์ตัวที่ 3 ในรูปแบบแอเรย์ (สามารถใส่ข้อมูลค้นหาลงใน Query ก็ได้แต่จะปลอดภัยสู้การแยกใส่ไม่ได้)
// SELECT * FROM world WHERE id=1000
$result = $model->db()->customQuery('SELECT * FROM world WHERE id=:id', false, array(':id' => 1000));
var_dump($result);

วิธีที่สอง ค้นหาข้อมูลด้วยคำสั่ง find() ให้ผลลัพท์เป็นแอเรย์ของอ๊อปเจ็คทั้งหมดที่ตรงตามเงื่อนไข
// SELECT * FROM world WHERE `id` = 1000 ORDER BY `id` DESC, `created_at` ASC
$result = $model->db()->find('world', array('id', 1000), array('id DESC', 'created_at ASC'));
print_r($result);

วิธีที่สาม ค้นหาข้อมูลด้วยคำสั่ง first() คืนค่าผลลัพท์ที่พบเพียงรายการเดียว
// SELECT * FROM world WHERE id=1000 LIMIT 1
$result = $model->db()->first('world', array('id', 1000));
print_r($result);


การเพิ่มข้อมูลลงในฐานข้อมูล ใช้ $model->db()->insert()
// INSERT INTO world (`id`,`created_at`) VALUES (1000, '2016-09-14 20:41:36')
$newId = $model->db()->insert('world', array('id' => 1000, 'created_at' => date('Y-m-d H:i:s')));

เมธอด insert จะคืนค่า id ของรายการที่เพิ่มใหม่กลับมา
การใช้งานฐานข้อมูลของคขสาร ตารางจะต้องมีฟิลด์ id ที่เป็น Key และ Auto Number ร่วมด้วยเสมอ เนื่องจากมีหลายฟังก์ชั่นที่ทำงานร่วมกับฟิลด์ id ของตาราง
การแก้ไขข้อมูลในฐานข้อมูล ใช้ $model->db()->update()
// UPDATE world SET `name` = 'ทดสอบ', `user_id` = 1 WHERE `id` = 1000
$model->db()->update('world', 1000, array('name' => 'ทดสอบ', 'user_id' => 1));


แก้ไขข้อมูลทั้งหมดในตาราง
// UPDATE world SET `name` = 'ทดสอบ', `user_id` = 1
$model->db()->updateAll('world', array('name' => 'ทดสอบ', 'user_id' => 1));


การลบข้อมูล
// DELETE FROM world WHERE id=1000
$model->db()->delete('world', 1000);


ลบข้อมูลทั้งหมดในตาราง
// TRUNCATE TABLE world
$model->db()->emptyTable('world');


ในกรณีที่การใช้งาน CRUD อยู่ในโมเดลอยู่แล้ว สามารถใช้คีย์เวิร์ด $this แทนการสร้างการเขื่อมต่อใหม่ได้
namespace Index\Mysql;

class Model extends \Kotchasan\Model
{

  public function get($id)
  {
    // SELECT * FROM world WHERE id=$id LIMIT 1
    $result = $this->db()->customQuery('SELECT * FROM world WHERE id=:id LIMIT 1', false, array(':id' => $id));
    // คืนค่าข้อมูลที่พบรายการเดียว ไม่พบข้อมูลคืนค่า false
    return empty($result) ? false : $result[0];
  }
}