Kotchasan PHP Framework

เริ่มต้นใช้งานฐานข้อมูล

ก่อนที่จะมีการใช้งานฐานข้อมูลของคชสาร จะต้องมีการตั้งค่าการเชื่อมต่อฐานข้อมูลก่อน โดยจะมีการตั้งค่าที่ไฟล์ settings/database.php
/* settings/database.php */
return array(
   /* ค่ากำหนดการเชื่อมต่อชุดที่ 1 */
    'mysql' => array(
       'dbdriver' => 'mysql',
       'username' => 'root',
       'password' => '',
       'dbname' => 'database_name',
       'hostname' => 'localhost',
       'port' => 3306,
       'prefix' => 'my'
    ),

    /* ค่ากำหนดการเชื่อมต่อ ชุดที่ 2 */
    'connection2' => array(
       'dbdriver' => 'mysql',
       'username' => 'username2',
       'password' => 'password2',
       'dbname' => 'dbname2',
       'hostname' => 'localhost',
       'port' => 3306,
       'prefix' => 'prefix2'
    ),
    /* รายชื่อตารางฐานข้อมูล และ ชื่อรอง */
    'tables' => array(
       'user' => 'users',
       'table2' => 'table2_name'

    )
);

ระบบฐานข้อมูลของคชสารสามารถเชื่อมต่อกับฐานข้อมูลได้หลายๆตัวพร้อมกัน (ขึ้นกับ Engine ของฐานข้อมูลที่นำมาใช้) โดยที่ฐานข้อมูลแต่ละตัวที่จะนำมาใช้จะมีการกำหนดค่าการเชื่อมต่อของตัวเอง ผมจะอธิบายการเชื่อมต่อเฉพาะที่การเชื่อมต่อชุดที่หนึ่งเท่านั้น โดยที่การเชื่อมต่อในชุดที่สองจะมีคำอธิบายเหมือนๆกัน
  • dbdriver คือชื่อ Driver ที่ใช้ในการเชือ่มต่อของฐานข้อมูล PDO เช่น mysql หมายถึงการเชื่อมต่อกับ PDO MySQL Driver
  • username,password ชื่อผู้ใช้และรหัสผ่านของฐานข้อมูล
  • dbname ชื่อฐานข้อมูล
  • hostname ชื่อโฮสต์ของฐานข้อมูล ปกติแล้วจะระบุเป็น localhost หรือ IP Address
  • port หมายเลขพอร์ต ค่าปกติของ MySQL คือ 3306
  • prefix เป็นคำนำหน้าชื่อตาราง ใช้เพื่อแยกตารางออกจากกัน หากมีการใช้ฐานข้อมูลร่วมกับโปรแกรมอื่น ถ้ากำหนดค่าจะได้ชื่อตารางเป็น prefix_tablename (มี _ คั่น) แต่ถ้ากำหนดเป็นค่าว่างจะได้ชื่อตารางเป็น tablename
ค่าเริ่มต้นของคชสารจะใช้การเชื่อมต่อชื่อ mysql ดังนั้นหากในแอพพลิเคชั่นมีแค่การเชื่อมต่อเดียว สามารถกำหนดค่าเพียงการเชื่อมต่อเดียวคือ mysql เท่านั้นก็ได้ ในกรณีที่ต้องการใช้ชื่อการเชื่อมต่ออื่น จะต้องระบุการเชื่อมต่อที่ต้องการในตอนที่สร้างการเชื่อมต่อกับฐานข้อมูล หรือกำหนดค่าลงในโมเดล

ส่วนของ tables ใช้สำหรับระบุรายชื่อของตาราง มีรูปแบบ
'tables' => array (
  'ชื่อรอง1' => 'ชื่อตาราง1'
  'ชื่อรอง2' => 'ชื่อตาราง2'

)

ซึ่งจะได้ผลลัพท์เมื่อมีการเรียกชื่อตาราง เช่น เมื่อเรียก $model->getTableName('ชื่อรอง1') จะได้ผลลัพท์เป็น prefix + _ + ชื่อตาราง1 (หรือ prefix_ชื่อตาราง1) นั่นเอง

Engine ที่เกี่ยวกับฐานของมูลของคชสารแบ่งออกเป็น 3 รูปแบบ
  • แบบพื้นฐาน CRUD (Create Read Update Delete) เป็นการใช้งานแบบพื้นฐานที่สุดของระบบฐานข้อมูล โดยที่การใช้งาน CRUD จะเป็นการใช้งาน Object ของฐานข้อมูลโดยตรง ดังนั้นมันจึงมีความสามารถกว้างขวางมาก สามารถทำได้ทุกอย่างที่ฐานข้อมูลทำได้ และมีความเร็วสูงที่สุด แต่เนื่องจากมันกระทำกับ Object กับฐานข้อมูลโดยตรง ทำให้รูปแบบและวิธีการเขียนคำสั่งจะขึ้นกับ Driver ที่เลือกใช้ในการเชื่อมต่อกับฐานข้อมูล
  • แบบที่สอง QueryBuilder ชื่อก็บอกว่าเป็นเครื่องมือสำหรับการสร้าง Query มันจะทำหน้าที่เป็นตัวกลางคั่นระหว่างผู้ใช้และ CRUD โดยอนุญาติให้เราเขียนคำสั่งในแบบที่เราคุ้นเคย และ QueryBuilder จะทำการแปลงคำสั่งให้เป็นรูปแบบที่ฐานข้อมูลแต่ละตัวต้องการ ซึ่งแน่นอนว่ามันจะช่วยให้เขียนง่ายขึ้น และการเปลี่ยนไปใช้งานฐานข้อมูลอื่นๆทำได้ง่ายแค่การเปลี่ยนไดร์เวอร์ แต่ก็ยังมีข้อจำกัดในการใช้งานคำสั่งที่ซับซ้อน ที่อาจไม่สามารถทำได้ แต่อย่างไรก็ตามในกรณีที่ต้องใช้งานคำสั่งที่ซับซ้อนก็ยังสามารถเขียนคำสั่งเพิ่มเติมโดยใช้ CRUD ได้
  • แบบที่สาม คือ Recordset ถูกออกแบบโดยการมองฐานข้อมูลเป็น Object หนึ่ง (อาจมีชื่อเรียกแตกต่างกันในเฟรมเวิร์คอื่นๆ เช่น ORM ย่อมาจาก Object Relational Mapping) โดยที่ในการเรียกข้อมูลจะใช้วิธีแบบ Object ในการเข้าถึงข้อมูลแทนการเขียนคำสั่ง SQL เช่น $rs->find($id) หมายถึงการเรียกข้อมูลที่ $id ทำให้ไม่ต้องจดจำคำสั่งของ SQL เลย ข้อดีที่สำคัญของ Recordset คือสามารถตั้งค่าให้ทำการสร้าง ตารางเสมือน (View) ได้แต่มีประสิทธิภาพดีกว่าการสร้าง View บนฐานข้อมูล แต่ก็มีข้อเสียเหมือน QueryBuilder ที่ไม่สามารถทำคำสั่งที่ซับซ้อนได้ และยังช้ากว่า QueryBuilder อีก