สำหรับเนื้อหาต่อไปนี้ จะขอพูดถึงในเชิงแยกออกมาจากโปรเจ็คของเรา
มาดูในเรื่องของการใช้งาน query builder class ในส่วนของการ select
ข้อมูลจากฐานข้อมูล ในรุปแบบต่างๆ เพื่อเป็นแนวทางในกาารนำไปประยุกต์
ในโปรเจ็คของเราต่อไปเพิ่มเติม
คำสั่ง sql ฐานข้อมูลต่าง และข้อมูลที่เราจะใช้ประกอบคำอธิบาย
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | CREATE TABLE IF NOT EXISTS `tbl_customer` ( `cus_id` int (11) NOT NULL AUTO_INCREMENT, `cus_name` varchar (100) COLLATE utf8_general_ci NOT NULL , PRIMARY KEY (`cus_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE =utf8_general_ci AUTO_INCREMENT=6 ; -- -- Dumping data for table `tbl_customer` -- INSERT INTO `tbl_customer` (`cus_id`, `cus_name`) VALUES (1, 'Cus A' ),(2, 'Cus B' ),(3, 'Cus C' ),(4, 'Cus D' ),(5, 'Cus E' ); -- -------------------------------------------------------- -- -- Table structure for table `tbl_order` -- CREATE TABLE IF NOT EXISTS `tbl_order` ( `order_id` int (11) NOT NULL AUTO_INCREMENT, `cus_id` int (11) NOT NULL , `pro_id` int (11) NOT NULL , PRIMARY KEY (`order_id`), KEY `cus_id` (`cus_id`,`pro_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE =utf8_general_ci AUTO_INCREMENT=11 ; -- -- Dumping data for table `tbl_order` -- INSERT INTO `tbl_order` (`order_id`, `cus_id`, `pro_id`) VALUES (1, 1, 3),(2, 2, 3),(3, 1, 4),(4, 3, 5),(5, 1, 5),(6, 3, 5),(7, 5, 2),(8, 5, 4),(9, 3, 2),(10, 5, 5); -- -------------------------------------------------------- -- -- Table structure for table `tbl_product` -- CREATE TABLE IF NOT EXISTS `tbl_product` ( `pro_id` int (11) NOT NULL AUTO_INCREMENT, `pro_name` varchar (100) COLLATE utf8_general_ci NOT NULL , `pro_price` int (11) NOT NULL , PRIMARY KEY (`pro_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE =utf8_general_ci AUTO_INCREMENT=6 ; -- -- Dumping data for table `tbl_product` -- INSERT INTO `tbl_product` (`pro_id`, `pro_name`, `pro_price`) VALUES (1, 'Pro 111' , 100),(2, 'Pro 222' , 200),(3, 'Pro 333' , 100),(4, 'Pro 444' , 250), (5, 'Pro 555' , 400); |
ใครที่กำลังศึกษาไปพร้อมๆ กัน ก็สามารถเอาคำสั้ง sql นี้ไปรัน ใน phpmyadmin เพื่อสร้างชุด
ข้อมูลทดสอบนี้ได้
ตารางและข้อมูลที่เกี่ยวข้อง
tbl_order
tbl_customer
tbl_product
order_id | cus_id | pro_id |
1 | 1 | 3 |
2 | 2 | 3 |
3 | 1 | 4 |
4 | 3 | 5 |
5 | 1 | 5 |
6 | 3 | 5 |
7 | 5 | 2 |
8 | 5 | 4 |
9 | 3 | 2 |
10 | 5 | 5 |
cus_id | cus_name |
1 | Cus A |
2 | Cus B |
3 | Cus C |
4 | Cus D |
5 | Cus E |
pro_id | pro_name | pro_price |
1 | Pro 111 | 100 |
2 | Pro 222 | 200 |
3 | Pro 333 | 100 |
4 | Pro 444 | 250 |
5 | Pro 555 | 400 |
การ select ข้อมูลจากฐานข้อมูลด้วย query builder class
ในที่นี้จะขอใช้หน้า admin_home.php จากโปรเจ็คเรามาเป็นไฟล์สำหรับเขียนโค้ดทดสอบ
ใครที่กำลังศักษา ไม่ต้องทำตามก็ได้ ลองอ่านดูเป็นแนวทาง สำหรับใครที่ทดสอบทำตามก็
ให้เปิดไฟล์ admin_home.php ในโฟลเดอร์ apps > views > admin และทดสอบเขียนโค้ดใน
ไฟล์นี้ได้เลย
$this->db->get()
เรามาเริ่มที่รูปแบบโค้ดการคิวรี่ข้อมูลมาแสดง พื้นฐานที่เราต้องรู้และใช้บ่อย
ก็คือการใช้ฟังก์ชั่น
$this->db->get()
ตัวอย่างเราต้องการดึงข้อมูลจากตาราง tbl_customer
ก็จะได้เป็น
1 2 3 4 | $this ->db->get( "tbl_customer" ); // คำสั่ง sql : // SELECT * FROM tbl_customer |
โดยในฟังก์ชั่นนี้เรา สามารถกำหนดขอบเขตของข้อมูลที่ต้องการแสดง หรือก็คือ limit
ได้ด้วยการกำหนด parameter ตัวที่ 2 กับ 3
1 2 3 4 | $this ->db->get( "tbl_customer" ,3,2); // คำสั่ง sql : // SELECT * FROM tbl_customer LIMIT 2,3 |
parameter ตัวที่สองคือจำนวนรายการที่ต้องการแสดง (limit)
parameter ตัวที่สามคือ เริ่มจากตำแหน่งที่ (offset)
(ระวังสับสนระหว่างการกำหนดสองค่านี้ เช่น เราต้องการ LIMIT 0,5 เราต้องกำหนดเป็น 5,0 เป็นต้น)
เรามาดูโค้ดการดึงข้อมูลและนำข้อมูลมาแสดง สำหรับกรณีวนลูปแสดง
ข้อมูลจากตาราง จะได้เป็นดังนี้
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $query = $this ->db->get( "tbl_customer" ); $total = $query ->num_rows(); // จำนวนข้อมูลจากการคิวรี่ทั้งหมด if ( $total >0){ // เช็คว่ามีค่ามากว่า 0 หรือไม่ foreach ( $query ->result_array() as $row ) // วนลูปแสดงข้อมูล { echo $row [ 'cus_id' ]; echo $row [ 'cus_name' ]; echo "<br>" ; } } ?> |
$this->db->get_where()
การคิวรี่ข้อมุลมาแสดงแบบกำหนดเงื่อนไข เหมาะกับการใช้ในการดึงข้อมูลของรายการใด
รายการหนึ่งมาแสดง เรามักจะใช้งานฟังก์ชั่น
$this->db->get_where()
เช่นเราอยากรู้ว่าตาราง tbl_customer ที่มี cus_id เท่ากับ 3 มีข้อมูลอะไรบ้าง ก็จะได้เป็น
1 2 3 4 | $this ->db->get_where( "tbl_customer" , array ( 'cus_id' =>3)); // คำสั่ง sql : // SELECT * FROM tbl_customer WHERE cus_id=3 |
เช่นเดียวกันคำสั่ง นี้ก็สามารถกำหนด limit และ offset เข้าไปได้ดังนี้
1 2 3 4 5 | $this ->db->get_where( "tbl_customer" , array ( 'cus_id' =>3),1,0); // คำสั่ง sql : // SELECT * FROM tbl_customer WHERE cus_id=3 LIMIT 1 // ถ้าค่า offset เป็น 0 คำสั่ง sql จะแสดงเพียงค่า limit เท่านั้น |
ที่นี้เรามาดูรูปแบบการคิวรี่และแสดงข้อมูลรายการเดียว เราจะใช้คำสั่งและรูปแบบดังต่อไปนี้
1 2 3 4 5 6 7 8 9 10 11 | <?php $query = $this ->db->get_where( "tbl_customer" , array ( 'cus_id' =>3)); $row = $query ->row_array(); //คิวรี่ข้อมูลมาแสดงแค่รายการเดียว if (isset( $row )) // ถ้ามีข้อมูล { echo $row [ 'cus_id' ]; echo $row [ 'cus_name' ]; echo "<br>" ; } ?> |
$this->db->select()
สำหรับฟังก์ชั่นต่อมา ใช้สำหรับการคิวรี่ข้อูลแบบระบุฟิลด์ที่ต้องการ ซึ่งปกติ ถ้าเรา
ใช้คำสั้ง $this->db->get() ก็จะดึงข้อมูลทุกฟิลด์มาแสดง ซึ่งก็คล้ายคำสั่ง SELECT *
แต่ถ้าหากเราต้องการระบุฟิลด์ที่ต้องการ เราจะใช้ฟังก์ชั่นนี้มาช่วย
$this->db->select()
เราต้องการดึงข้อมูลจากตาราง tbl_product โดยดึงเฉพาะ pro_name กับ pro_price
จะได้เป็น
1 2 3 4 5 | $this ->db->select( "pro_name,pro_price" ); $query = $this ->db->get( "tbl_product" ); // คำสั่ง sql : // SELECT pro_name,pro_price FROM tbl_product |
$this->db->select_max()
$this->db->select_min()
$this->db->select_avg()
$this->db->select_sum()
ฟังก์ชั่นสำหรับค่าทางคณิตศาสตร์หรือสถิติเบื้องต้น ได้แก่
$this->db->select_max() หาค่าสูงสุด
$this->db->select_min() หาค่าตำสุด
$this->db->select_avg() หาค่าเฉลี่ย
$this->db->select_sum() หาผลรวม
โดยรูปแบบการใช้งานของฟังก์ชั่นทั้ง 4 จะเหมือนกัน ขอยกส่วนของการ
หารผลรวมมาอธิบาย
จากตาราง tbl_product เราต้องการดูราคารวมของสินค้าทั้งหมด
จะได้เป็น
1 2 3 4 5 | $this ->db->select_sum( 'pro_price' ); $query = $this ->db->get( "tbl_product" ); // คำสั่ง sql : // SELECT SUM(pro_price) AS pro_price FROM tbl_product |
หากเราต้องการกำหนดเป็นชื่ออื่น สามารถทำได้ดังนี้
1 2 3 4 5 | $this ->db->select_sum( 'pro_price' , 'total_price' ); $query = $this ->db->get( "tbl_product" ); // คำสั่ง sql : // SELECT SUM(pro_price) AS total_price FROM tbl_product |
$this->db->from()
ฟังก์ชั่นต่อมาคือในส่วนของ FROM ในคำสั่งคิวรี่ ใช้สำหรับระบุตาราง ที่ต้องการ
โดยเมื่อเรากำหนดตารางเข้าไปในฟังก์ชั่นนี้แล้ว ใน่ส่วนของฟังก์ชั่น
$this->db->get() เราไม่จำเป็นต้องระบุชื่อตารางอีก
ตัวอย่างเราต้องการดึงข้อมูลทั้งหมดของตาราง tbl_order
1 2 3 4 5 | $this ->db->from( 'tbl_order' ); $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM tbl_order |
จะเห็นว่า กรณีเราเลือกทุกฟิลด์มาแสดง เราไม่จำเป็นต้องกำหนด select() ฟังก์ชั่นก็ได้
1 2 3 4 5 | $this ->db->from( 'tbl_order a' ); $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_order` `a` |
แบบกำหนดชื่อเรียกไว้อ้างอิง ก็สามารถทำได้เช่นกัน
$this->db->get_compiled_select()
ก่อนจะไปต่อในส่วนอื่นๆ เราจะมาแนะนำฟังก์ชั่นที่ใช้สำหรับดูค่าคำสั่ง sql
ที่สร้างจาก query builder class ว่าคำสั่งที่เราใช้นั้น ถูกต้องตรงตามที่เราต้องการหรือไม่
โดยสามารถกำหนดได้ดังนี้
1 2 3 | $this ->db->from( 'tbl_order' ); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); |
เราจะแทรกไว้ก่อนฟังก์ชั่น $this->db->get() และกำหนดค่า FALSE เพื่อให้คำสั่ง sql
นั่นทำงานต่อมาจนถึงฟังก์ชั่น $this->db->get() เพื่อคิวรี่ข้อมูลมาแสดง
จากคำสั่งนี้ จะมีการแสดงคำสั่ง sql จากการใช้งาน query builder
หากเราไม่ได้ใช้งานแล้วก็สามารถ comment ปิดไปได้ ในที่นี้ขอเก็บไว้
$this->db->join()
การเชื่อมตารางหรือการคิวรี่ข้อมูลจากตารางที่มีความสัมพันธ์กัน สามารถทำได้โดยใช้ฟังก์ชั่น
$this->db->join()
ตัวอย่างเช่น เราต้องการดึงข้อมูลจากตาราง tbl_order และ tbl_product โดยข้อมูลทั้งสองตาราง
จะต้องสัมพันธ์กัน ว่า pro_id ของทั้งสองตารางจะต้องเท่ากัน สามารถทำได้ดังนี้
1 2 3 4 5 6 7 | $this ->db->from( 'tbl_order' ); $this ->db->join( 'tbl_product' , 'tbl_order.pro_id=tbl_product.pro_id' ); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_order` JOIN `tbl_product` ON `tbl_order`.`pro_id`=`tbl_product`.`pro_id` |
หรือถ้าเราต้องการกำหนดชื่อเรียกให้กับตาราง เพื่อให้เรียกใช้งานง่ายขึ้นสามารถทำได้ดังนี้
1 2 3 4 5 6 7 | $this ->db->from( 'tbl_order a' ); $this ->db->join( 'tbl_product b' , 'a.pro_id=b.pro_id' ); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_order` `a` JOIN `tbl_product` `b` ON `a`.`pro_id`=`b`.`pro_id` |
หากต้องการระบุรูปแบบของการ join ตาราง เช่น left, right, outer, inner, left outer, and right outer
ให้เราระบุเพิ่มเข้าไปใน parameter ตัวที่ 3 เช่น เราต้องการให้ตาราง tbl_order และ tbl_product เชื่อมกัน
แบบ left join สามารถทำได้ดังนี้
1 2 3 4 5 6 7 | $this ->db->from( 'tbl_order a' ); $this ->db->join( 'tbl_product b' , 'a.pro_id=b.pro_id' , 'left' ); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_order` `a` LEFT JOIN `tbl_product` `b` ON `a`.`pro_id`=`b`.`pro_id` |
หากต้องการเชื่อมมากกว่า สองตาราง เช่น เราต้องการเชื่อมตาราง tbl_order , tbl_product และ tbl_customer
แบบ left join ก็สามารถทำได้ดังนี้
1 2 3 4 5 6 7 8 9 10 | $this ->db->from( 'tbl_order a' ); $this ->db->join( 'tbl_product b' , 'a.pro_id=b.pro_id' , 'left' ); $this ->db->join( 'tbl_customer c' , 'a.cus_id=c.cus_id' , 'left' ); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_order` `a` // LEFT JOIN `tbl_product` `b` ON `a`.`pro_id`=`b`.`pro_id` // LEFT JOIN `tbl_customer` `c` ON `a`.`cus_id`=`c`.`cus_id` |
$this->db->where()
การคิวรี่ข้อมูลแบบมีเงื่อนไขอย่างง่าย เราสามารถใช้งาน $this->db->get_where() ได้เลย แต่สำหรับ
กรณีการใช้งานเพิมเติม หรือมีเงื่อนไขจำนวนมาก เราสามารถใช้งานฟังก์ชั่นนี้ระบุชี้ชัดรูปแบบเงื่อนไขได้
รูปแบบการใช้งานของฟังก์ชั่น where() นี้สามารถกำหนดได้ดังนี้
1. รูปแบบ key / value
ตัวอย่างต้องการดังข้อมูลจากตาราง tbl_product ที่ราคาสินค้า = 100
1 2 3 4 5 6 7 | $this ->db->from( 'tbl_product' ); $this ->db->where( 'pro_price' ,100); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_product` WHERE `pro_price` = 100 |
การกำหนดในลักษณะนี้จะกำหนดให้มีค่า การเทียบโดยใช้เครื่องหมาย = ให้อัตโนมัติ
ถ้าเราเพิ่มเงื่อนไขหลายอัน ก็จะถูกเชื่อมด้วย AND
1 2 3 4 5 6 7 8 | $this ->db->from( 'tbl_product' ); $this ->db->where( 'pro_price' ,100); $this ->db->where( 'pro_name' , 'Pro 333' ); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_product` WHERE `pro_price` = 100 AND `pro_name` = 'Pro 333' |
2. รูปแบบ key / value แบบกำหนดเอง
ใช้สำหรับ กรณีไม่ได้ตรวจสอบการเท่ากันของข้อมูล โดยเรา
สามารถแทรก ส่วนของเครื่องหมายท่างคณิตศาสตร์ เพื่อเปรียบเทียบค่าของข้อมูลได้
เช่นต้องการดึงข้อมูลจากตาราง tbl_product ที่เราค่ามากกว่า 200 สามารถทำได้ดังนี้
1 2 3 4 5 6 7 | $this ->db->from( 'tbl_product' ); $this ->db->where( 'pro_price >' ,200); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_product` WHERE `pro_price` > 200 |
ต้องการตรวจสอบตาราง tbl_product ที่มีราคาอยู่ระหว่าง 200 ถึง 300 บาท
1 2 3 4 5 6 7 8 | $this ->db->from( 'tbl_product' ); $this ->db->where( 'pro_price >=' ,200); $this ->db->where( 'pro_price <=' ,300); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_product` WHERE `pro_price` >= 200 AND `pro_price` <= 300 |
เครื่องหมายอื่นๆ เช่น != > < >= <=
3. การกำหนดแบบ array การใช้งานรูปแบบนี้
จะมีประโยชน์กรณีเราต้องการเก็บค่าข้อมูลหรือจัดรูปแบบข้อมูล
จากฟังก์ชั่นหรือการใช้งานส่วนอื่น แล้วค่อยนำมาใช้การกำหนดเงื่อนไข where
1 2 3 4 5 6 7 8 9 10 11 | $arr_condition = array ( 'pro_price >=' =>200, 'pro_price <=' =>300 ); $this ->db->from( 'tbl_product' ); $this ->db->where( $arr_condition ); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_product` WHERE `pro_price` >= 200 AND `pro_price` <= 300 |
4. แบบกำหนดเองชุดสั่ง sql เข้าไปเลย
1 2 3 4 5 6 7 | $this ->db->from( 'tbl_product' ); $this ->db->where( 'pro_price >=200 AND pro_price<=300' ); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_product` WHERE `pro_price` >= 200 AND `pro_price` <= 300 |
$this->db->or_where()
หากต้องการเปลี่ยนจากการเชื่อม AND เป็น OR สำหรับเงื่อนไข WHERE ให้ใช้ฟังก์ชั่นนี้แทน
ส่วนการใช้งานก็คล้ายกับฟังก์ชั่น $this->db->where()
ตัวอย่างการใช้งานร่วมกัน สมมติเราต้องการรายการสินค้า น้อยกว่าเท่ากับ 100
หรือ ที่มากกว่าเท่ากับ 300 จากตาราง tbl_product สามารถทำได้ดังนี้
1 2 3 4 5 6 7 8 | $this ->db->from( 'tbl_product' ); $this ->db->where( 'pro_price <=' ,100); $this ->db->or_where( 'pro_price >=' ,300); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_product` WHERE `pro_price` <= 100 OR `pro_price` >= 300 |
$this->db->where_in()
หากต้องการคิวรี่ข้อมูลจากฐานข้อมูลที่มีฟิลด์ที่ต้องการอยู่ในชุดข้อมูลที่กำหนดหรือไม่
เช่น สมมติเราต้องการสินค้าในตาราง tbl_product ที่มีราคาเท่ากับ 100 200 หรือ 500
จะได้เป็น
1 2 3 4 5 6 7 8 | $setData = array (100,200,300); $this ->db->from( 'tbl_product' ); $this ->db->where_in( 'pro_price' , $setData ); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_product` WHERE `pro_price` IN(100, 200, 300) |
ฟังก์ชั่นที่มีรูปแบบการใช้งานเหมือนกัน แตกต่างที่เงื่อนไข
$this->db->or_where_in() เมื่อต้องการใช้การเชื่อมด้วย OR
$this->db->where_not_in() เมื่อต้องการตรวจว่า ไม่มีข้อมูลตรงตามเซ็ตข้อมูลที่ระบุ
$this->db->or_where_not_in() เมื่อต้องการใช้การเชื่อมด้วย OR กับข้อมูลที่ไม่ตรงตามเซ็ตข้อมูลที่ระบุ
$this->db->like()
ต่อมาที่ฟังก์ชั่นสำหรับตรวจข้อมูลที่คล้ายกัน ใช้กับพวกข้อความต่างๆ ที่ต้องการตรวจสอบว่า
ตรงกับคำหรือข้อความที่ระบุหรือไม่ ส่วนใหญ่เราจะพบบ่อยในการค้นหาข้อมูล
ตัวอย่างสมมติเราต้องการดูชื่อสินค้าในตาราง tbl_product ที่มีชื่อสินค้ามีคำว่า 22
1 2 3 4 5 6 7 | $this ->db->from( 'tbl_product' ); $this ->db->like( 'pro_name' ,22); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_product` WHERE `pro_name` LIKE '%22%' ESCAPE '!' |
นอกนั้นเรายังสามารถกำหนดเงื่อนไขการตรวจสอบข้อมูลเพิ่มเติม โดยการระบุว่า both before หรือ after
both คือ ขึ้นต้นหรือลงท้ายด้วยอะไรก็ได้ แต่ให้มีข้อความที่ระบุอยู่ในนั้น
ปกติค่า both จะเป็นค่าเริ่มต้น ถ้าเราไม่ระบุ ก้จะเป็นค่านี้อยู่แล้ว ตามคำสั่ง sql คือจะมี % ทั้งก่อนและหลัง
before คือ ขึ้นต้นด้วยอะไรก็ได้แต่ต้องลงท้ายด้วยข้อความที่เราต้องการตรวจสอบ จะมี % อยู่ด้านหน้า
after คือ ลงท้ายด้วยอะไรก็ได้ แต่ต้องขึ้นต้นข้อความที่ต้องการตรวจสอบ และมี % อยู่ด้านหลัง
ตัวอย่างการใช้งาน
1 2 3 4 5 6 7 | $this ->db->from( 'tbl_product' ); $this ->db->like( 'pro_name' ,22, 'before' ); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_product` WHERE `pro_name` LIKE '%22' ESCAPE '!' |
ฟังก์ชั่นที่มีรูปแบบการใช้งานเหมือนกัน แตกต่างที่เงื่อนไข
$this->db->or_like() เมื่อต้องการตรวจสอบข้อมูลที่ตรง และใช้การเชื่อมด้วย OR
$this->db->not_like() เมื่อต้องการตรวจว่า ข้อมูลไม่ตรงตามเงื่อนไข
$this->db->or_not_like() เมื่อต้องการใช้การเชื่อมด้วย OR กับข้อมูลไม่ตรงตามเงื่อนไข
$this->db->group_by()
ฟังก์ชั่นในการจัดกลุ่มข้อมูล หรือส่วนของ GROUP BY ในคำสั่ง sql
ปกติจะใช้สำหรับ จัดการกับชุดของข้อมูล เช่น หาว่าชุดข้อมูลนั้น มีผลรวมเท่าไหร่
ตัวอย่าง เราต้องการนับว่า ในตาราง tbl_order สินค้าแต่ละประเภทมีรายการสั่งซื้อเท่าไหร่
1 2 3 4 5 6 7 8 | $this ->db->select( 'COUNT(*) as num_pro' ); $this ->db->from( 'tbl_order' ); $this ->db->group_by( 'pro_id' ); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT COUNT(*) as num_pro FROM `tbl_order` GROUP BY `pro_id` |
$this->db->having()
ฟังก์ชั่นนี้ใช้สำหรับเลือกข้อมูลที่ได้จากการ GROUP BY อีกที เช่นจากตัวอย่างการใช้ GROUP BY ของโค้ดด้านบน
เพื่อหาว่าสินค้าที่ละรายการมีจำนวนที่สั่งมาเท่าไหร่ ที้นี้เราจะมาตรวจสอบว่า ต้องการเฉพาะจำนวนที่มากกว่า 3 รายการ
หรือกคือ num_pro จากตัวอย่างที่แล้วมากกว่า 3
1 2 3 4 5 6 7 8 9 | $this ->db->select( 'COUNT(*) as num_pro' ); $this ->db->from( 'tbl_order' ); $this ->db->group_by( 'pro_id' ); $this ->db->having( 'num_pro >' ,3); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT COUNT(*) as num_pro FROM `tbl_order` GROUP BY `pro_id` HAVING `num_pro` > 3 |
หากต้องการใช้งานเชื่อมด้วย OR ให้ใช้งานฟังก์ชั่น $this->db->or_having()
$this->db->order_by()
ส่วนเกือบสุดท้าย ฟังก์ชั่นสำหรับจัดเรียงข้อมูล รูปแบบการใช้งานง่าย
ตัวอย่าง สมมติเราต้องการแสดงข้อมูลตาราง tbl_product เรียงราคาจาก มากไปน้อย ก็สามารถกำหนดได้เป็น
1 2 3 4 5 6 7 | $this ->db->from( 'tbl_product' ); $this ->db->order_by( 'pro_price' , 'DESC' ); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_product` ORDER BY `pro_price` DESC |
เราสามารถกำหนดในรูปแบบต่อไปนี้ได้ เช่น
1 | $this ->db->order_by( 'pro_price DESC' ); |
หรือกำหนดหลายๆ เงื่อนไข
1 | $this ->db->order_by( 'pro_price DESC,pro_name ASC' ); |
หรือ
1 2 | $this ->db->order_by( 'pro_price' , 'DESC' ); $this ->db->order_by( 'pro_name' , 'ASC' ); |
หากต้องการ RANDOM
1 | $this ->db->order_by( 'pro_nam' , 'RANDOM' ); |
$this->db->limit()
การกำหนด limit และ offset ของข้อมูลที่ต้องการแสดง ซึ่งเราได้อธิบายไปบ้างแล้วในตอนแรก
ของเนื้อหาบทความนี้ ก็มาดูการใช้งานกันเลย
1 2 3 4 5 6 7 | $this ->db->from( 'tbl_product' ); $this ->db->limit(3,2); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_product` LIMIT 2, 3 |
$this->db->count_all()
ฟังก์ชั่นสำหรับหาจำนวนแถวทั้งหมดของข้อมูลในตาราง ตัวอย่าง
เราต้องการรู้ว่าตาราง tbl_order มีรายการทั้งหมดกี่รายการ
1 2 | $total = $this ->db->count_all( 'tbl_order' ); echo $total ; |
$this->db->count_all_results()
เป็นฟังก์ชั่นสำหรับหาจำนวนของข้อมูลจากผลของการคิวรี่ตามเงื่อนไขต่างๆ ที่เรากล่าวไปแล้ว
เหมาะสำหรับมาใช้ในการค้นหา และแบ่งหน้าข้อมูลจากผลการค้นหาอีกที
1 2 3 4 5 6 7 8 9 10 | $this ->db->from( 'tbl_product' ); $this ->db->where( 'pro_price >200' ); $total_result = $this ->db->count_all_results(null,FALSE); echo $total_result ; $this ->db->limit(3,2); echo $this ->db->get_compiled_select(null,FALSE); // สำหรับโชว์คำสั่ง sql ลบออกถ้าไม่ใช้ $query = $this ->db->get(); // คำสั่ง sql : // SELECT * FROM `tbl_product` WHERE `pro_price` > 200 LIMIT 2, 3 |
จะเห็นว่าฟังก์ชั่นนี้จะทำงานก่อนใช้งาน limit ฟังก์ชั่น ค่าที่ได้ก่อน limit จะเป็นจำนวนทั้งหมด
ที่เป็นไปตามเงื่อนไข where แต่หลังจากใช้ฟังก์ชั่น limit จะไม่มีข้อมูลในตำแหน่งดังกล่าว
ฟังก์ชั่นนี้เราเคยใช้มาแล้วในส่วนของการแบ่งหน้าและการค้นหาข้อมูล
ฟังก์ชั่นของ query builder ในรุปแบบ chaining
เป็นรุปแบบการใช้งานการเรียกใช้ฟังก์ชั่นต่างๆ แบบผูก เขียนต่อๆ กัน ทำให้เราเขียนโค้ดได้กระชับขึ้น
ดูตัวอย่าง
1 2 3 4 5 6 | $this ->db->from( 'tbl_order a' ); $this ->db->join( 'tbl_product b' , 'a.pro_id=b.pro_id' , 'left' ); $this ->db->join( 'tbl_customer c' , 'a.cus_id=c.cus_id' , 'left' ); $this ->db->order_by( 'b.pro_price' , 'desc' ); $this ->db->limit(5,10); $query = $this ->db->get(); |
เราสามาถเขียนในรูปแบบ chaining ได้ดังนี้
1 2 3 4 5 6 | $query = $this ->db->from( 'tbl_order a' ) ->join( 'tbl_product b' , 'a.pro_id=b.pro_id' , 'left' ) ->join( 'tbl_customer c' , 'a.cus_id=c.cus_id' , 'left' ) ->order_by( 'b.pro_price' , 'desc' ) ->limit(5,10) ->get(); |
แบบนี้เป็นต้น ขอจบในส่วนการทบทวนเพิ่มเติมเกี่ยวกับการใช้งาน query builder ไว้เท่านี้