สำหรับเนื้อหาต่อไปนี้ จะขอพูดถึงในเชิงแยกออกมาจากโปรเจ็คของเรา
มาดูในเรื่องของการใช้งาน query builder class ในส่วนของการ select
ข้อมูลจากฐานข้อมูล ในรุปแบบต่างๆ เพื่อเป็นแนวทางในกาารนำไปประยุกต์
ในโปรเจ็คของเราต่อไปเพิ่มเติม
คำสั่ง sql ฐานข้อมูลต่าง และข้อมูลที่เราจะใช้ประกอบคำอธิบาย
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
ก็จะได้เป็น
$this->db->get("tbl_customer"); // คำสั่ง sql : // SELECT * FROM tbl_customer
โดยในฟังก์ชั่นนี้เรา สามารถกำหนดขอบเขตของข้อมูลที่ต้องการแสดง หรือก็คือ limit
ได้ด้วยการกำหนด parameter ตัวที่ 2 กับ 3
$this->db->get("tbl_customer",3,2); // คำสั่ง sql : // SELECT * FROM tbl_customer LIMIT 2,3
parameter ตัวที่สองคือจำนวนรายการที่ต้องการแสดง (limit)
parameter ตัวที่สามคือ เริ่มจากตำแหน่งที่ (offset)
(ระวังสับสนระหว่างการกำหนดสองค่านี้ เช่น เราต้องการ LIMIT 0,5 เราต้องกำหนดเป็น 5,0 เป็นต้น)
เรามาดูโค้ดการดึงข้อมูลและนำข้อมูลมาแสดง สำหรับกรณีวนลูปแสดง
ข้อมูลจากตาราง จะได้เป็นดังนี้
<?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 มีข้อมูลอะไรบ้าง ก็จะได้เป็น
$this->db->get_where("tbl_customer",array('cus_id'=>3)); // คำสั่ง sql : // SELECT * FROM tbl_customer WHERE cus_id=3
เช่นเดียวกันคำสั่ง นี้ก็สามารถกำหนด limit และ offset เข้าไปได้ดังนี้
$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 เท่านั้น
ที่นี้เรามาดูรูปแบบการคิวรี่และแสดงข้อมูลรายการเดียว เราจะใช้คำสั่งและรูปแบบดังต่อไปนี้
<?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
จะได้เป็น
$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 เราต้องการดูราคารวมของสินค้าทั้งหมด
จะได้เป็น
$this->db->select_sum('pro_price'); $query = $this->db->get("tbl_product"); // คำสั่ง sql : // SELECT SUM(pro_price) AS pro_price FROM tbl_product
หากเราต้องการกำหนดเป็นชื่ออื่น สามารถทำได้ดังนี้
$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
$this->db->from('tbl_order'); $query = $this->db->get(); // คำสั่ง sql : // SELECT * FROM tbl_order
จะเห็นว่า กรณีเราเลือกทุกฟิลด์มาแสดง เราไม่จำเป็นต้องกำหนด select() ฟังก์ชั่นก็ได้
$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 ว่าคำสั่งที่เราใช้นั้น ถูกต้องตรงตามที่เราต้องการหรือไม่
โดยสามารถกำหนดได้ดังนี้
$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 ของทั้งสองตารางจะต้องเท่ากัน สามารถทำได้ดังนี้
$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`
หรือถ้าเราต้องการกำหนดชื่อเรียกให้กับตาราง เพื่อให้เรียกใช้งานง่ายขึ้นสามารถทำได้ดังนี้
$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 สามารถทำได้ดังนี้
$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 ก็สามารถทำได้ดังนี้
$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
$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
$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 สามารถทำได้ดังนี้
$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 บาท
$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
$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 เข้าไปเลย
$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 สามารถทำได้ดังนี้
$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
จะได้เป็น
$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
$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 คือ ลงท้ายด้วยอะไรก็ได้ แต่ต้องขึ้นต้นข้อความที่ต้องการตรวจสอบ และมี % อยู่ด้านหลัง
ตัวอย่างการใช้งาน
$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 สินค้าแต่ละประเภทมีรายการสั่งซื้อเท่าไหร่
$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
$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 เรียงราคาจาก มากไปน้อย ก็สามารถกำหนดได้เป็น
$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
เราสามารถกำหนดในรูปแบบต่อไปนี้ได้ เช่น
$this->db->order_by('pro_price DESC');
หรือกำหนดหลายๆ เงื่อนไข
$this->db->order_by('pro_price DESC,pro_name ASC');
หรือ
$this->db->order_by('pro_price','DESC'); $this->db->order_by('pro_name','ASC');
หากต้องการ RANDOM
$this->db->order_by('pro_nam', 'RANDOM');
$this->db->limit()
การกำหนด limit และ offset ของข้อมูลที่ต้องการแสดง ซึ่งเราได้อธิบายไปบ้างแล้วในตอนแรก
ของเนื้อหาบทความนี้ ก็มาดูการใช้งานกันเลย
$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 มีรายการทั้งหมดกี่รายการ
$total = $this->db->count_all('tbl_order'); echo $total;
$this->db->count_all_results()
เป็นฟังก์ชั่นสำหรับหาจำนวนของข้อมูลจากผลของการคิวรี่ตามเงื่อนไขต่างๆ ที่เรากล่าวไปแล้ว
เหมาะสำหรับมาใช้ในการค้นหา และแบ่งหน้าข้อมูลจากผลการค้นหาอีกที
$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
เป็นรุปแบบการใช้งานการเรียกใช้ฟังก์ชั่นต่างๆ แบบผูก เขียนต่อๆ กัน ทำให้เราเขียนโค้ดได้กระชับขึ้น
ดูตัวอย่าง
$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 ได้ดังนี้
$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 ไว้เท่านี้