ทบทวนการใช้งาน query builder เพิ่มเติม สำหรับการ select ข้อมูล

เขียนเมื่อ 8 ปีก่อน โดย Ninenik Narkdee
codeigniter 3 codeigniter query builder

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ codeigniter 3 codeigniter query builder

ดูแล้ว 7,913 ครั้ง


สำหรับเนื้อหาต่อไปนี้ จะขอพูดถึงในเชิงแยกออกมาจากโปรเจ็คของเรา
มาดูในเรื่องของการใช้งาน 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 ไว้เท่านี้


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ



อ่านต่อที่บทความ













URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ