
step 2 codeigniter กับ database หรือ model
บทความนี้ ต่อจากบทความ step 1 เริ่มต้น ใช้งาน codeigniter เริ่มเขียนจริง โดยตอนนี้ จะพามาเจาะลึกกับ model กัน เพื่อให้สามารถใช้งาน database ต่างๆกับ codeigniter ได้
เล่าเรื่อง database ใน codeigniter ให้ฟังหน่อยแล้วกันครับ เนื่องจาก codeigniter มี database layer มาให้เราเรียกใช้ ทำให้ชีวิตเราง่ายขึ้น (รึเปล่า) ในการเขียนระบบเชื่อมกับ database โดยใน codeigniter นั้น เค้ามีระบบที่เรียกว่า Active Record มาให้เราใช้งาน ซึ่งเจ้า Active Record นี้ จะเป็นตัวช่วยให้เราทำงานกับ database ได้ง่ายขึ้น และยืดหยุ่นกว่าการเขียน query ตามปกติ เพราะว่า รองรับ database หลายชนิดด้วยการเขียน model เพียงครั้งเดียว
ตัวอย่างเช่น หากเรา อยากได้ ข้อมูลจาก database ทั้งหมด เราจะเขียน query ว่า mysql_query('SELECT * FROM tablename');
ซึ่งแต่หากเราใช้ Active Record เราจะเขียนได้ว่า $this->db->get('tablename');
เท่านี้เองครับ แล้วเอาผลลัพท์ไปใช้ต่อ(รายละเอียดขั้นตอนหลังจากนี้ก็จะต่างกันไปอีกเล็กน้อยครับ) แต่อีกข้อที่ได้เปรียบก็คือ เราสามารถเปลี่ยน database ได้ทันทีเพียงแค่ตั้งค่า config ใหม่ ที่เหลือ Active Record จัดการให้ โดยที่เราไม่ต้องแก้ไข คำสั่งเลย จากตัวอย่างที่ยกมาเมื่อกี้ แน่นอนว่าเราเอาคำสั่ง mysql_query ไปใช้ในระบบ database ของ postgres ไม่ได้ครับ แต่ทั้งนี้ codeigniter ไม่ได้บังคับเลย ว่าต้องใช้ Active Record เพราะว่าส่วนตัวผมก็ทำงานกับ CI มาสามปีได้ ก็ใช้ mysql_query มาตลอด (แต่เขียน library มาใช้เองจะได้พิมพ์ได้สั้นลงและได้ผลลัพท์ที่ตรงใจขึ้น) ไม่ติดขัดอะไรเลย เพราะว่างานที่ทำมาทั้งหมด ยังไม่มีงานไหนต้องเปลี่ยน database เลยแม้แต่งานเดียว
เริ่มเขียน MVC ใน codeigniter
ผมจะยึดตามบทความเก่าเลยนะครับ ถือว่าทุกท่านมีไฟล์ ตามตัวอย่างแล้ว
- ทำการสร้างไฟล์ model โดย เปิด folder /application/models สร้างไฟล์ใหม่ ตั้งชื่อว่า news_m.php
- เขียนโค้ด
<?php class News_m extends CI_Model { function get_data(){ return mysql_query("select * from tablename"); } } ?>
- ให้ทำการเตรียมฐานข้อมูลแบบ mysql ในเครื่องของท่านเอง โดยตั้งชื่อ database ว่า dbtest และตั้งชื่อ table ว่า tablename โดยให้กำหนด field และ ใส่ค่าเข้าไปให้เรียบร้อยสักสองถึงสาม record โดยส่วนนี้ก็เหมือนการสร้าง database , table ตามปกตินะครับ ไม่ขอกล่าวในรายละเอียด ส่วนผมทำได้แบบนี้ครับ
- เราจะทำการตั้งค่า config codeigniter เพื่อให้เชื่อมกับ database ได้อย่างถูกต้อง โดยการ เปิดไฟล์ /application/config/database.php ที่ต้องแก้ไขก็คือ username, password, database(ใส่ชื่อ database) ตามที่เครื่องท่านใช้งานอยู่
- ทำการ initial database โดยเปิดไฟล์ใน controller มาเพื่อให้สั่งเรียก database ขึ้นมา โดยใช้ไฟล์ในตัวอย่างเก่าคือ /application/controllers/news.php แล้วแก้ function myfunction() เป็นดังนี้
public function myfunction(){ $this->load->database(); $this->load->model('news_m'); echo $this->news_m->get_data(); }
- ทดสอบว่าการตั้งค่าถูกต้อง โดยการเปิดหน้าเว็บ ซึ่งก็คือ /ci210/index.php/news/myfunction (หรือถ้าเป็นตัวอย่างของผมคือ http://localhost/ci210/index.php/news/myfunction ) หากไม่พบข้อความใดๆ แปลว่าไม่ถูกต้อง ให้ตรวจสอบข้อ 3-4อีกครั้งครับ หากถูกต้องจะได้ข้อความ Resource id #31 (มาจาก object ที่ query ได้จาก model ข้อที่ 2 ส่งต่อให้ controller ในข้อที่ 5 มาแสดงผล)
นี่เป็นวิธีการเรียก model เข้ามาใน controller ครับ และยังเป็นวิธีการเรียก function ที่อยู่ใน model นั้นเพื่อเอาค่าเข้ามาใน controller ด้วย โดยหากเรารับค่าจาก $this->news_m->get_data() ก็จะเหมือนกับเราเขียนคำสั่ง mysql_query() ใน controller นั่นแหล่ะครับ แต่ด้วย concept ของ MVC แล้ว เราไม่ทำอย่างนั้นครับ เราจะแยกส่วน database ออกไปใน model เลย เช่นเดียวกับที่เราแยกส่วน HTML ไปใส่ใน view นั่นเอง
และจากตัวอย่างก็คงสังเกตได้ว่า เวลาที่เราเรียก model เข้ามาแล้ว เราจะใช้งาน เราก็ใช้ $this->model_name ได้เลย และชี้อีกครั้งไปที่ function ซึ่งแน่นอน ว่าเราสามารถส่งค่าเข้าไปได้ด้วย และใน model ก็เขียนตัวแปรรับค่าตามปกติเหมือนที่เราเขียน function โดยทั่วไปนั่นเองครับ
ทีนี้ ว่ากันต่ออีกเรื่องก็คือ หลังจากที่เรา เขียน controller ได้แล้ว เรียกมาแสดงผล คู่กับ view ได้แล้ว(ตามบทความก่อน) และตอนนี้เราก็เชื่อมต่อ database เพื่อดำเนินการได้แล้ว ต่อไปก็คือ การส่งค่าให้ view บ้าง เพราะว่าการส่งค่าจาก controller ให้ view นั้นไม่เหมือนกับการส่งค่าระหว่าง controller กับ model ที่เราเรียกเป็น function ตามปกติ
การส่งค่าจาก controller ให้ view
- เรียก view ตามปกติเช่น บทความเก่าเราเขียนว่า $this->load->view('news_myfunction');
- สร้างตัวแปรแบบ array ใน controller เช่น $data['testtest'] = 'ข้อความนี้ส่งมาจาก controller';
- ใส่ตัวแปรดังกล่าวในคำสั่ง load view ดังนี้ $this->load->view('news_myfunction',$data);
เท่านี้ หน้า view เราก็จะได้ค่าที่มาจาก controller แล้วครับ แต่ความแปลกมันอยู่ที่ controller ส่งไปเป็น array แต่ว่าในหน้า view จะเหลือแต่ตัวแปร จากตัวอย่าง ส่ง $data['testtest'] ให้ เวลาใช้งานในหน้า view ให้เราใช้งาน $testtest เลย ถ้าเราต้องการส่งหลายตัวแปรพร้อมกัน ก็สร้าง index ใหม่ในตัวแปรเดิม เช่น $data['testtest'] กับ $data['test2'] เป็นต้น จะทำให้หน้า view มีตัวแปร $testtest และ $test2 นั่นเอง ส่วนค่าที่เก็บในตัวแปรนั้นจะเป็น อะไรก็ได้ ตั้งแต่ตัวเลขยัน object เลย
เรื่องพื้นฐานก็หมดแล้วครับ พอถูไถใช้งานได้แล้ว แต่ว่าตอนที่ผมเริ่ม ผมยังจำได้นั่งอ่านคู่มือ codeigniter จนครบทุกหน้าเลยครับ ทำความเข้าใจโดยละเอียดเลย แล้วบางส่วนก็ลองเขียนตามดูด้วยทำให้เข้าใจได้เร็วขึ้นมาก รวมทั้งเอาไปใช้เขียงานจริงเลย แรกๆก็กระท่อนกระแท่นครับ เพราะว่า งง ไปๆมาๆ ก็เริ่มเข้าใจมากขึ้น ทำให้ปัจจุบันผมทำงานบน codeigniter โดยตลอดครับ โดยทุกวันนี้ก็ยังต้องเปิดอ่านคู่มืออยู่เสมอครับ เวลาที่เขียนงาน เพราะว่าหลายอย่างก็จำไม่ได้หรอก เปิดไปเขียนไปนั่นแหล่ะ ทั้งนี้คู่มือ มีอยู่ในไฟล์ที่ download มาด้วยนะครับ ลองเปิดแฟ้มที่ชื่อ user_guide ดูครับ หรือเปิดเว็บ codeigniter ตัวทดสอบของท่านด้วย /user_guide อย่างของผมก็เปิดที่ http://localhost/ci210/user_guide/ ถึงจะเป็นภาษาอังกฤษแต่ทำความเข้าใจได้ไม่ยากครับ และจะรู้ว่ามีอะไรให้เราใช้งานเยอะมาก รวมทั้งทำให้เราเข้าใจมันมากขึ้นด้วย
ผมแนะนำว่าคนที่ใช้ codeigniter ควรเปิดใจก่อนเป็นสิ่งแรก เพราะว่ามันจะเปลี่ยนรูปแบบการทำงานจากที่เคยทำมาทั้งหมดครับ และแรกๆจะไปอย่างช้าๆ เพราะทุกอย่างมันต้องฝึกครับ หลังๆเราจะเขียนงานได้เร็ว เป็นระบบ ระเบียบ และสะอาดขึ้นมาก ทีนี้เวลาที่เราทำงานบน codeigniter แบบเต็มระบบแล้ว ถ้าต้องส่งงานให้คนอื่น ที่เค้าใช้ codeigniter เป็นอยู่แล้ว เราไม่ต้องบอกอะไรเค้าเลยครับ เพราะว่าทุกคนทำงานบนมาตรฐานเดียวกันแล้ว และการไล่ตรวจสอบแก้ไขปัญหาจะเป็นไปได้เร็วมากเพราะไม่ต้องไล่โค้ดเป็นพันๆบรรทัด ไม่ต้องไล่ if ซ้อนกันไม่รู้กี่ชั้น หรือว่า script php ที่ปนมั่วอยู่กับ html เป็นจำนวนมากๆ
ส่วนเรื่องของ model ที่ว่าจะเขียนแบบธรรมดา หรือใช้ active record ดีนั้น พิจารณาสองเรื่องครับ 1.มีโอกาสที่จะเปลี่ยนชนิดของ database หรือไม่ ถ้ามีให้ใช้ active record เลย 2. มีเวลาศึกษาและทดสอบใช้งานหรือไม่ ถ้ามีก็ active record เช่นกัน แต่ผมเขียนธรรมดามา 3 ปี พึ่งจะเริ่มใช้ active record ไม่กี่เดือนมานี้เองครับ ก็ทำให้โค้ดสั้นขึ้นอีกหน่อย ถึงยังไม่ถนัดเท่าไร แต่ก็พอได้ครับ
ลองดูนะครับ อย่าลืมคู่มือ สำคัญครับ ขอให้มีความสุขกับการใช้ codeigniter ครับ มีอะไรก็มาแลกเปลี่ยนกันได้ครับ