CodeIgnitor: Lớp Query Builder

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

CodeIgniter cho phép ta truy cập lớp Query Builder. Lớp này cho phép các thông tin được truy xuất, chèn và cập nhật trong cơ sở dữ liệu bằng cách viết các câu lệnh (script) ngắn gọn và tối giản. Trong một số trường hợp chỉ có một hoặc hai dòng lệnh cần thiết để thực hiện thao tác trên một cơ sở dữ liệu. CodeIgniter không yêu cầu mỗi bảng trong cơ sở dữ liệu phải có tập tin lớp của chính nó, thay vào đó nó sẽ cung cấp một giao diện (interface) đơn giản.

Ngoài tính đơn giản, một lợi ích lớn nữa của việc sử dụng các tính năng của Query Builder là nó cho phép tạo Cơ sở dữ liệu độc lập với các ứng dụng do cú pháp truy vấn được tạo bởi từng bộ chuyển đổi cơ sở dữ liệu. Sử dụng Query Builder cũng đảm bảo các truy vấn được an toàn hơn vì các giá trị được hệ thống tự động thiết lập tính an toàn.

Lưu ý
Nếu bạn muốn viết các truy vấn riêng mà không cần dùng đến Query Builder thì bạn có thể vô hiệu hóa lớp này trong tập tin cấu hình cơ sở dữ liệu, điều này sẽ cho phép thư viện cơ sở dữ liệu lõi và bộ chuyển đổi sử dụng ít tài nguyên hơn.

Các khả năng sau của Query Builder được mô tả bằng các nhóm hàm dưới đây.

Các hàm SELECT dữ liệu

Dưới đây sẽ trình bày những hàm dùng để xây dựng các câu lệnh SELECT.

$this->db->get()

Hàm này sẽ thực hiện câu lệnh select và trả về kết quả là các bản ghi có được, nó tương đương với câu lệnh Select * From Tên_bảng.

$query = $this->db->get('mytable'); // Tương đương: SELECT * FROM mytable

Tham số thứ 2 và 3 của hàm cho phép ta thiết lập vị trí bắt đầu lấy bản ghi và số lượng bản ghi muốn lấy:

$query = $this->db->get('mytable', 10, 20);

// Tương đương: SELECT * FROM mytable LIMIT 20, 10

Cần lưu ý rằng để lấy kết quả truy vấn thì cần phải gán hàm cho một biến, hàm trên được gán cho một biến có tên $query:

$query = $this->db->get('mytable');

foreach ($query->result() as $row)
{
    echo $row->title;
}

$this->db->get_compiled_select()

Hàm này trả về câu lệnh truy vấn dưới dạng một chuỗi.

Ví dụ:

$sql = $this->db->get_compiled_select('mytable');
echo $sql;

// Sẽ in ra chuỗi: SELECT * FROM mytable

Tham số thứ 2 cho phép ta thiết lập việc có hay không query builder được thiết đặt lại (mặc định là có, giống như khi sử dụng $this->db->get()):

echo $this->db->limit(10,20)->get_compiled_select('mytable', FALSE);

// Sẽ in ra chuỗi: SELECT * FROM mytable LIMIT 20, 10

echo $this->db->select('title, content, date')->get_compiled_select();

// Sẽ in ra chuỗi: SELECT title, content, date FROM mytable LIMIT 20, 10

Một điểm quan trọng cần lưu ý trong ví dụ trên là câu truy vấn thứ hai không sử dụng $this->db->from() và không truyền tên bảng vào tham số thứ nhất. Lý do là vì câu truy vấn không được thực thi bằng cách sử dụng $this->db->get() để đặt lại giá trị hoặc đặt lại thư mục bằng cách sử dụng $this->db->reset_query().

$this->db->get_where()

Tương tự như hàm trên, chỉ khác là nó có thêm mệnh đề where ở tham số thứ hai mà không cần sử dụng hàm db->where():

$query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset);

Vui lòng đọc thêm về mệnh để where phía dưới để biết thêm thông tin.

Lưu ý
get_where() trước đây có định dạng là getwhere() và bây giờ định dạng này đã bị bỏ.

$this->db->select()

Hàm này cho phép ta thực hiện câu lệnh SELECT với các cột mong muốn:

$this->db->select('title, content, date');
$query = $this->db->get('mytable');

// Tương đương: SELECT title, content, date FROM mytable

 

Lưu ý
Nếu muốn chọn tất cả các cột của một bảng thì ta không cần sử dụng hàm này, chỉ cần dùng hàm $this->db->get().

$this->db->select() có tham số tùy chọn thứ hai, nếu ta đặt là FALSE thì CodeIgniter sẽ không bảo về các trường hay các bảng nữa. Điều này rất hữu ích nếu như ta cần một câu lệnh select gộp trong đó có thể bỏ qua những trường ảnh hưởng đến câu lệnh gộp này.

$this->db->select('(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4') AS amount_paid', FALSE);
$query = $this->db->get('mytable');

$this->db->select_max()

Hàm này dùng để lấy giá trị lớn nhất của cột cụ thể, tham số thứ hai của hàm dùng để đặt bí danh.

$this->db->select_max('age');
$query = $this->db->get('members');
// Tương đương: SELECT MAX(age) as age FROM members

$this->db->select_max('age', 'member_age');
$query = $this->db->get('members');
// Tương đương: SELECT MAX(age) as member_age FROM members

$this->db->select_min()

Hàm này tương tự hàm trên nhưng dùng để lấy giá trị nhỏ nhất của cột.

$this->db->select_min('age');
$query = $this->db->get('members');
// Produces: SELECT MIN(age) as age FROM members

$this->db->select_avg()

Hàm này tương tự hàm trên, nhưng dùng để tính giá trị trung bình của cột.

$this->db->select_avg('age');
$query = $this->db->get('members');
// Produces: SELECT AVG(age) as age FROM members

$this->db->select_sum()

Hàm này tương tự hàm trên, nhưng dùng để tính tổng các giá trị của cột.

$this->db->select_sum('age');
$query = $this->db->get('members');
// Produces: SELECT SUM(age) as age FROM members

$this->db->from()

Hàm này dùng để tạo mệnh đề FROM trong truy vấn:

$this->db->select('title, content, date');
$this->db->from('mytable');
$query = $this->db->get();
// Produces: SELECT title, content, date FROM mytable

 

Lưu ý
Ta nên dùng $this->db->get() vì hàm này tạo mệnh đề FROM.

$this->db->join()

Hàm dùng để liên kết bảng:

$this->db->select('*');
$this->db->from('blogs');
$this->db->join('comments', 'comments.id = blogs.id');
$query = $this->db->get();

// Sẽ tạo ra:
// SELECT * FROM blogs JOIN comments ON comments.id = blogs.id

Bạn có quyền gọi hàm này nhiều lần để liên kết nhiều bảng.

Nếu bạn cần xác định kiểu của JOIN thì bạn có thể thực hiện bằng tham số thứ 3 của hàm. Các tùy chọn gồm: left, right, outer, inner, left outer, và right outer.

$this->db->join('comments', 'comments.id = blogs.id', 'left');
// Tương đương: LEFT JOIN comments ON comments.id = blogs.id

Các hàm truy vấn với WHERE

$this->db->where()

Hàm này cho phép bạn thiết lập mệnh đề WHERE sử dụng một trong bốn cách thức sau:

Lưu ý
Tất cả các giá trị được truyền tới hàm này đều bị ngắt tự động để tạo các truy vấn an toàn hơn.

1. Dùng key/value thông thường:

$this->db->where('name', $name); // Sẽ tạo ra: WHERE name = 'Joe'

Lưu ý rằng dấu gán tự động được thêm.

Nếu bạn sử dụng nhiều lời gọi hàm thì có thể chúng sẽ được gộp với nhau thông qua toán tử AND:

$this->db->where('name', $name);
$this->db->where('title', $title);
$this->db->where('status', $status);
// WHERE name = 'Joe' AND title = 'boss' AND status = 'active'

2. Dùng key/value tùy chỉnh:

Ta có thể đưa vào một toán tử trong tham số thứ nhất để điều khiển phép toán so sánh:

$this->db->where('name !=', $name);
$this->db->where('id <', $id); // Sẽ tạo ra: WHERE name != 'Joe' AND id < 45

3. Dùng mảng kết hợp:

$array = array('name' => $name, 'title' => $title, 'status' => $status);
$this->db->where($array);
// Sẽ tạo ra: WHERE name = 'Joe' AND title = 'boss' AND status = 'active'

Ta có thể gộp các toán tử mong muốn bằng cách sử dụng cách thức như sau:

$array = array('name !=' => $name, 'id <' => $id, 'date >' => $date);
$this->db->where($array);

4. Dùng chuỗi tùy chỉnh:

Ta cũng có thể viết một chuỗi truy vấn thông thường như sau:

$where = "name='Joe' AND status='boss' OR status='active'";
$this->db->where($where);

$this->db->where() sẽ chấp nhận một tùy chọn ở tham số thứ ba. Nếu bạn thiết lập là FALSE thì CodeIgniter sẽ không bảo vệ các trường hay bảng của bạn.

$this->db->where('MATCH (field) AGAINST ("value")', NULL, FALSE);

$this->db->or_where()

Hàm này dùng để thiết lập đa điều kiện theo OR:

$this->db->where('name !=', $name);
$this->db->or_where('id >', $id);  // Sẽ tạo ra: WHERE name != 'Joe' OR id > 50

$this->db->where_in()

Hàm này dùng thể thiết lập điều kiện sử dụng mệnh đề IN().

$names = array('Frank', 'Todd', 'James');
$this->db->where_in('username', $names);
// Sẽ tạo ra: WHERE username IN ('Frank', 'Todd', 'James')

$this->db->or_where_in()

Hàm này dùng để kết hợp đa điều kiện OR với mệnh đề IN():

$names = array('Frank', 'Todd', 'James');
$this->db->or_where_in('username', $names);
// Sẽ tạo ra: OR username IN ('Frank', 'Todd', 'James')

$this->db->where_not_in()

Hàm này sẽ tạo ra điều kiện kết hợp với mệnh đề NOT IN():

$names = array('Frank', 'Todd', 'James');
$this->db->where_not_in('username', $names);
// Sẽ tạo ra: WHERE username NOT IN ('Frank', 'Todd', 'James')

$this->db->or_where_not_in()

$names = array('Frank', 'Todd', 'James');
$this->db->or_where_not_in('username', $names);
// Sẽ tạo ra: OR username NOT IN ('Frank', 'Todd', 'James')

Các hàm tìm kiếm dữ liệu tương tự

$this->db->like()

Phương thức này cho phép sử dụng mệnh đề LIKE trong điều kiện, nó rất hữu dụng để tìm kiếm.

1. key/value đơn giản:

$this->db->like('title', 'match');
// Tạo ra: WHERE `title` LIKE '%match%' ESCAPE '!'

Ta có quyền sử dụng cùng lúc nhiều lần phương thức này, khi đó đa kiều kiện sẽ là AND:

$this->db->like('title', 'match');
$this->db->like('body', 'match');
// Sẽ tạo ra: WHERE `title` LIKE '%match%' ESCAPE '!' AND  `body` LIKE '%match% ESCAPE '!'

Ta có thể điều khiển vị trí của ký hiệu (%) bằng cách sử dụng đối số thứ ba với các lựa chọn là 'before', 'after' và 'both', trong đó mặc định là 'both'.

$this->db->like('title', 'match', 'before'); // Sẽ tạo ra: WHERE `title` LIKE '%match' ESCAPE '!'
$this->db->like('title', 'match', 'after');  // Sẽ tạo ra: WHERE `title` LIKE 'match%' ESCAPE '!'
$this->db->like('title', 'match', 'both');   // Sẽ tạo ra: WHERE `title` LIKE '%match%' ESCAPE '!'

2. Sử dụng mảng kết hợp:

$array = array('title' => $match, 'page1' => $match, 'page2' => $match);
$this->db->like($array);
// Tương ứng: WHERE `title` LIKE '%match%' ESCAPE '!' AND  `page1` LIKE '%match%' ESCAPE '!' AND  `page2` LIKE '%match%' ESCAPE '!'

$this->db->or_like()

Phương thức này kết hợp đa kiều kiện mệnh đề LIKE với OR:

$this->db->like('title', 'match'); $this->db->or_like('body', $match);
// Tương tự: WHERE `title` LIKE '%match%' ESCAPE '!' OR  `body` LIKE '%match%' ESCAPE '!

$this->db->not_like()

$this->db->not_like('title', 'match');
// Tương tự: WHERE `title` NOT LIKE '%match% ESCAPE '!'

$this->db->or_not_like()

$this->db->like('title', 'match');
$this->db->or_not_like('body', 'match');
// Sẽ tạo ra: WHERE `title` LIKE '%match% OR  `body` NOT LIKE '%match%' ESCAPE '!'

$this->db->group_by()

Phương thức này tương ứng với việc sử dụng mệnh đề GROUP BY:

$this->db->group_by("title"); // Sẽ tạo ra: GROUP BY title

Ta cũng có thể truyền đối số dạng mảng như sau:

$this->db->group_by(array("title", "date"));
// Sẽ tạo ra: GROUP BY title, dat

$this->db->distinct()

Phương thức này thêm từ khóa "DISTINCT" vào truy vấn:

$this->db->distinct();
$this->db->get('table');
// Sẽ tạo ra: SELECT DISTINCT * FROM table

$this->db->having()

Phương thức này tương ứng với việc sử dụng mệnh đề HAVING trong truy vấn. Ta có thể viết theo hai cách như sau:

$this->db->having('user_id = 45');  // Tương ứng: HAVING user_id = 45
$this->db->having('user_id'45);  // Tương ứng: HAVING user_id = 45

Ta cũng có thể sử dụng mảng trong đối số như sau:

$this->db->having(array('title =' => 'My Title', 'id <' => $id));
// Sẽ tạo ra: HAVING title = 'My Title', id < 45

Bạn có thể thiết lập câu truy vấn chuẩn bằng cách sử dụng đối số thứ 3 và thiết lập là FALSE.

$this->db->having('user_id',  45);  // Sẽ tạo ra: HAVING `user_id` = 45 ; MySQL thường là thế này
$this->db->having('user_id',  45, FALSE);  // Sẽ tạo ra: HAVING user_id = 45

$this->db->or_having()

Tương tự như hàm having(), chỉ khác là các điều kiện phân cách nhau bằng đa điều kiện OR.

Các hàm sắp xếp kết quả

$this->db->order_by()

Hàm này dùng để thay thế mệnh đề ORDER BY.

Tham số thứ nhất chưa tên của cột bạn muốn sắp xếp, tham số thứ hai dùng để thiết lập hướng sắp xếp, có 3 hướng là ASC, DESC và RANDOM.

$this->db->order_by('title', 'DESC');
// Sẽ tạo ra: ORDER BY `title` DESC

Ta cũng có thể truyền đối số dưới dạng chuỗi cho tham số thứ nhất.

$this->db->order_by('title DESC, name ASC');
// Sẽ tạo ra: ORDER BY `title` DESC, `name` ASC

Ta cũng được quyền sử dụng hàm này nhiều lần như sau:

$this->db->order_by('title', 'DESC');
$this->db->order_by('name', 'ASC');
// Sẽ tạo ra: ORDER BY `title` DESC, `name` ASC

Nếu ta chọn sắp xếp RANDOM thì tham số thứ nhất sẽ bị bỏ qua, trừ trường hợp nó là một số.

$this->db->order_by('title', 'RANDOM');
// Tương đương: ORDER BY RAND()

$this->db->order_by(42, 'RANDOM');
// Tương đương: ORDER BY RAND(42)

 

Chú ý
Sắp xếp Random hiện tại không được Oracle hỗ trợ, nó sẽ thay thế bằng mặc định ASC.

Các hàm giới hạn số lượng trong kết quả

$this->db->limit()

Hàm này sẽ tương ứng với hàm limit() của MySQL:

$this->db->limit(10);  // Tương ứng: LIMIT 10

Tham số thứ hai chính là vị trí bắt đầu lấy số bản ghi.

$this->db->limit(10, 20); // Sẽ tạo ra: LIMIT 20, 10

$this->db->count_all_results()

Hàm này dùng để đếm số bản ghi có được từ câu lệnh truy vấn, trong đó nó chấp nhận những hàm như where(), or_where(), like()or_like(), ... Ví dụ:

echo $this->db->count_all_results('my_table');  // In ra số lượng bản ghi từ câu lệnh truy vấn với bảng my_table
$this->db->like('title', 'match');
$this->db->from('my_table');
echo $this->db->count_all_results(); // In ra số lượng bản ghi sau khi áp dụng hàm like() để tìm bản ghi

Lưu ý là phương thức này cũng có thể được dùng để thiết lập lại giá trị nào bạn đã truyền cho hàm select(). Vậy nên, nếu bạn không muốn thay đổi giá trị thì bạn truyền FALSE ở đối số thứ hai của hàm:

echo $this->db->count_all_results('my_table', FALSE);

$this->db->count_all()

Hàm này sẽ đếm số bản ghi trong một bảng cụ thể. Ví dụ:

echo $this->db->count_all('my_table');  // Trả về tất cả các bản ghi của bảng my_table

Các hàm tạo nhóm điều kiện truy vấn

Nhóm truy vấn cho phép ta tạo các nhóm điều kiện trong mệnh đề WHERE. Điều này sẽ cho phép ta tạo các câu lệnh truy vấn với những điều kiện phức tạp. Ví dụ:

$this->db->select('*')->from('my_table')
        ->group_start()
                ->where('a', 'a')
                ->or_group_start()
                        ->where('b', 'b')
                        ->where('c', 'c')
                ->group_end()
        ->group_end()
        ->where('d', 'd')
->get();

// Sẽ tạo ra:
// SELECT * FROM (`my_table`) WHERE ( `a` = 'a' OR ( `b` = 'b' AND `c` = 'c' ) ) AND `d` = 'd'

 

Lưu ý
Mỗi nhóm cần phải một cặp group_start() và group_end().

$this->db->group_start()

Bắt đầu một nhóm mới, hàm này tương ứng với dấu mở ngoặc tròn ở mệnh đề WHERE của câu truy vấn (xem ví dụ trên).

$this->db->or_group_start()

Bắt đầu một nhóm mới, tương ứng với dấu mở ngoặc tròn và ở phía trước nó là 'OR' (xem ví dụ trên).

$this->db->not_group_start()

Bắt đầu một nhóm mới, tương ứng với dấu mở ngoặc tròn và ở phía trước nó là 'NOT'.

$this->db->or_not_group_start()

Bắt đầu một nhóm mới, tương ứng với dấu mở ngoặc tròn và ở phía trước nó là 'OR NOT'.

$this->db->group_end()

Kết thúc nhóm hiện thời, tương ứng với dấu đóng ngoặc tròn ở mệnh đề WHERE của câu truy vấn.

Các hàm chèn dữ liệu

$this->db->insert()

Hàm này tương ứng với câu lệnh INSERT dựa trên dữ liệu mà ta cung cấp để thực hiện câu truy vấn. Ta cũng có thể truyền một mảng hoặc một đối tượng tới hàm. Dưới đây là một ví dụ sử dụng mảng:

$data = array(
        'title' => 'My title',
        'name' => 'My Name',
        'date' => 'My date'
);

$this->db->insert('mytable', $data);
// Sẽ tạo ra:
INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')

Tham số đầu tiên của hàm sẽ chứa tên bảng, tham số thứ hai là một mảng kết hợp các giá trị muốn insert.

Còn đây là một ví dụ sử dụng đối tượng:

/*
class Myclass {
        public $title = 'My Title';
        public $content = 'My Content';
        public $date = 'My Date';
}
*/

$object = new Myclass;
$this->db->insert('mytable', $object);
// Sẽ tạo ra:
INSERT INTO mytable (title, content, date) VALUES ('My Title', 'My Content', 'My Date')

Tham số đầu tiên chứa tên bảng, tham số thứ hai là một đối tượng.

Lưu ý
Tất cả các giá trị đều được tự động thêm những yếu tố để tạo lên câu lệnh truy vấn an toàn.

$this->db->get_compiled_insert()

Biên dịch câu truy vấn insert thành dạng $this->db->insert() nhưng không thực thi, mà trả về một chuỗi chứa câu lệnh truy vấn.

Ví dụ:

$data = array(
        'title' => 'My title',
        'name'  => 'My Name',
        'date'  => 'My date'
);

$sql = $this->db->set($data)->get_compiled_insert('mytable');
echo $sql;

// Sẽ tao ra chuỗi:
"INSERT INTO mytable (`title`, `name`, `date`) VALUES ('My title', 'My name', 'My date')"

Tham số thứ hai của hàm cho phép ta thiết lập việc có hay không reset lại câu truy vấn, mặc định là có (TRUE):

echo $this->db->set('title', 'My Title')->get_compiled_insert('mytable', FALSE);

// Sẽ tạo ra chuỗi:
"INSERT INTO mytable (`title`) VALUES ('My Title')"

echo $this->db->set('content', 'My Content')->get_compiled_insert();

// Sẽ tạo ra chuỗi:
"INSERT INTO mytable (`title`, `content`) VALUES ('My Title', 'My Content')"

Một chú ý quan trọng đối với ví dụ trên là câu truy vấn thứ hai không được dùng hàm $this->db->from() và cũng không được truyền bảng ở tham số thứ nhất. Lý do là bởi hàm này trả về chuỗi truy vấn chứ không thực thi câu truy vấn giống như hàm $this->db->insert() (hàm này có thể thiết lập lại các giá trị hoặc thiết lập lại trực tiếp bằng hàm $this->db->reset_query()).

Lưu ý
Phương thức này không sử dụng với việc insert nhiều lần hoặc một lô (batch) insert.

$this->db->insert_batch()

Hàm này sẽ tạo ra một chuỗi lệnh truy vấn dựa trên dữ liệu của bạn, và sau đó thực hiện truy vấn đấy. Ta có thể truyền một mảng hoặc một đối tượng tới hàm. Dưới đây là ví dụ sử dụng mảng:

$data = array(
        array(
                'title' => 'My title',
                'name' => 'My Name',
                'date' => 'My date'
        ),
        array(
                'title' => 'Another title',
                'name' => 'Another Name',
                'date' => 'Another date'
        )
);

$this->db->insert_batch('mytable', $data);
// Sẽ tạo ra:
INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'),  ('Another title', 'Another name', 'Another date')

Tham số đầu tiên là tên bảng, tham số thứ hai là mảng kết hợp các giá trị.

Lưu ý
Tất cả các giá trị insert đều được bảo đảm để tạo câu lệnh truy vấn an toàn.

Các hàm cập nhật dữ liệu

$this->db->replace()

Phương thức này sẽ thực hiện câu lệnh REPLACE, câu lệnh này dựa trên chuẩn SQL đối với cặp câu lệnh (tùy chọn) DELETE + INSERT, trong đó sử dụng các ràng buộc PRIMARY và UNIQUE để xác định thành phần. Mục đích của hàm là để giúp ta tiết kiệm trong việc thực hiện các logic phức tạp với những sự kết hợp khác nhau của các lời gọi tới các hàm select()update()delete() và insert().

Ví dụ:

$data = array(
        'title' => 'My title',
        'name'  => 'My Name',
        'date'  => 'My date'
);

$this->db->replace('table', $data);

// Sẽ thực hiện:
REPLACE INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')

Ở ví dụ trên, nếu ta giả sử rằng trường title là khóa chính (PK) thì nếu một hàng nào đó chứa tiêu đề là 'My title' thì hàng đó sẽ bị xóa và thay thế bằng một hàng mới.

Bạn cũng được quyền sử dụng phương thức set() cho phương thức này, khi đó tất cả các trường sẽ được tự động đảm bảo an toàn giống như phương thức insert().

$this->db->set()

Hàm này có nhiệm vụ thiết lập các giá trị để thực hiện các thao tác insert và update.

Hàm này cũng có thể được sử dụng để thay thế cho việc truyền mảng dữ liệu trực tiếp tới các hàm insert hoặc update:

$this->db->set('name', $name);
$this->db->insert('mytable');
// Produces:
INSERT INTO mytable (`name`) VALUES ('{$name}')

Nếu bạn sử dụng nhiều lời gọi hàm thì chúng sẽ được ghép theo đúng cách dựa trên trên thao tác bạn muốn làm là insert hay update:

$this->db->set('name', $name);
$this->db->set('title', $title);
$this->db->set('status', $status);
$this->db->insert('mytable');

set() cũng có một tham số nữa (tham số tùy chọn) là tham số thứ 3 ($escape), tham số này sẽ ngăn cản dữ liệu không cho đảm bảo an toàn nếu đặt giá trị là FALSE. Để minh họa điều này, ví dụ dưới đây hàm set() với việc sử dụng và không sử dụng tham số thứ 3.

$this->db->set('field', 'field+1', FALSE);
$this->db->where('id', 2);
$this->db->update('mytable');
// cho ra:
UPDATE mytable SET field = field+1 WHERE id = 2

$this->db->set('field', 'field+1');
$this->db->where('id', 2);
$this->db->update('mytable');
// cho ra:
UPDATE `mytable` SET `field` = 'field+1' WHERE `id` = 2

Bạn cũng có thể truyền một mảng kết hợp tới hàm này như sau:

$array = array(
        'name' => $name,
        'title' => $title,
        'status' => $status
);

$this->db->set($array);
$this->db->insert('mytable');

Hoặc truyền một đối tượng như sau:

/*
class Myclass {
        public $title = 'My Title';
        public $content = 'My Content';
        public $date = 'My Date';
}
*/

$object = new Myclass;
$this->db->set($object);
$this->db->insert('mytable');

$this->db->update()

Hàm này tạo một chuỗi update và thực hiện truy vấn dựa trên dữ liệu đầu vào. Ta có thể truyền một mảng hoặc một đối tượng tới ham này. Dưới đây là ví dụ truyền mảng:

$data = array(
        'title' => $title,
        'name' => $name,
        'date' => $date
);

$this->db->where('id', $id);
$this->db->update('mytable', $data);
// Sẽ tạo ra:
UPDATE mytable SET title = '{$title}', name = '{$name}', date = '{$date}' WHERE id = $id

Còn đây là ví dụ truyền đối tượng:

/*
class Myclass {
        public $title = 'My Title';
        public $content = 'My Content';
        public $date = 'My Date';
}
*/

$object = new Myclass;
$this->db->where('id', $id);
$this->db->update('mytable', $object);
// Sẽ tạo ra:
UPDATE `mytable` SET `title` = '{$title}', `name` = '{$name}', `date` = '{$date}' WHERE id = `$id

Từ ví dụ trên bạn thấy rằng ta có thể sử dụng hàm $this->db->where() đi kèm với hàm update() để có thể thiết lập điều kiện update. Ta cũng có thể tùy chọn truyền thông tin trực tiếp tới hàm update dưới dạng chuỗi như sau:

$this->db->update('mytable', $data, "id = 4");

Hoặc dưới dạng mảng như sau:

$this->db->update('mytable', $data, array('id' => $id));

Ngoài ra, ta cũng có thể sử dụng hàm $this->db->set() để thực hiện update.

$this->db->update_batch()

Hàm này sẽ tạo một chuỗi update dựa trên dữ liệu đầu vào thực hiện truy vấn tương ứng. Ta cũng có thể truyền dữ liệu dạng mảng hoặc dạng đối tượng tới hàm. Ví dụ dưới đây là truyền dạng mảng:

$data = array(
   array(
      'title' => 'My title' ,
      'name' => 'My Name 2' ,
      'date' => 'My date 2'
   ),
   array(
      'title' => 'Another title' ,
      'name' => 'Another Name 2' ,
      'date' => 'Another date 2'
   )
);

$this->db->update_batch('mytable', $data, 'title');

// Sẽ tạo ra:
// UPDATE `mytable` SET `name` = CASE
// WHEN `title` = 'My title' THEN 'My Name 2'
// WHEN `title` = 'Another title' THEN 'Another Name 2'
// ELSE `name` END,
// `date` = CASE
// WHEN `title` = 'My title' THEN 'My date 2'
// WHEN `title` = 'Another title' THEN 'Another date 2'
// ELSE `date` END
// WHERE `title` IN ('My title','Another title')

Tham số đầu tiên của hàm sẽ chứa tên bảng, tham số thứ hai là mảng các giá trị, còn tham số thứ ba liên quan đến mệnh đề where.

Lưu ý
Hàm affected_rows() sẽ không cho ta kết quả phù hợp với phương thức này do bản chất của cách thức hoạt động của nó, thay vào đó ta nên dùng hàm update_batch().

$this->db->get_compiled_update()

Hàm này làm việc chuẩn xác tương tự như hàm $this->db->get_compiled_insert() ngoại trừ việc nó tạo ra một chuỗi truy vấn UPDATE thay vì chuỗi truy vấn INSERT.

Các bạn xem lại về hàm $this->db->get_compiled_insert() để hiểu rõ hơn về hàm này.

Lưu ý
Hàm này không làm việc với lô lệnh update.

Các hàm xóa dữ liệu

$this->db->delete()

Hàm này tạo một câu lệnh DELETE và thực thi nó.

$this->db->delete('mytable', array('id' => $id));
// sẽ tạo ra:
DELETE FROM mytable WHERE id = $id

Tham số đầu tiên là tên bảng, tham số thứ hai là mệnh đề where. Ta cũng có thể sử dụng hàm where() hoặc or_where() để truyền dữ liệu cho tham số thứ hai như sau:

$this->db->where('id', $id);
$this->db->delete('mytable');

// Sẽ tạo ra:
DELETE FROM mytable WHERE id = $id

Ta cũng có thể truyền một mảng gồm tên của các bảng tới hàm delete() nếu ta muốn xóa nhiều bảng cùng lúc.

$tables = array('table1', 'table2', 'table3');
$this->db->where('id', '5');
$this->db->delete($tables);

Nếu ta muốn xóa tất cả dữ liệu của một bảng thì  ta có thể sử dụng hàm truncate() hoặc empty_table().

$this->db->empty_table()

Hàm này cũng tạo câu lệnh delete và thực thực thi nó như hàm trên, nhưng đơn giản hơn ở chỗ nó không có đối số thứ hai, tức không có mệnh đề where:

$this->db->empty_table('mytable'); // Sẽ tạo ra: DELETE FROM mytable

$this->db->truncate()

Hàm này tạo câu lệnh truncate và thực thi nó:

$this->db->from('mytable');
$this->db->truncate();

// hoặc

$this->db->truncate('mytable');

// sẽ tạo ra:
TRUNCATE mytable

 

Lưu ý
Nếu câu lệnh TRUNCATE không thực thi được thì truncate() sẽ được thực thi theo dạng "DELETE FROM table".

$this->db->get_compiled_delete()

Hàm này làm việc chuẩn xác như hàm $this->db->get_compiled_insert() ngoại trừ việc nó tạo câu lệnh DELETE mà không phải câu lệnh INSERT.

Bạn xem thêm thông tin chi tiết ở hàm $this->db->get_compiled_insert().

Chuỗi phương thức

Chuỗi phương thức cho phép ta đơn giản hóa cú pháp bằng cách kết nối nhiều hàm. Ví dụ:

$query = $this->db->select('title')
                ->where('id', $id)
                ->limit(10, 20)
                ->get('mytable');

Bộ nhớ đệm Query Builder

Khi không tiến hành đệm (caching) thì Query Builder cho phép ta lưu trữ các phần nhất định của các truy vấn để có thể tái sử dụng tại vị trí sau đó khi thực hiện script. Thông thường thì khi Query Builder được gọi hoàn chỉnh thì tất cả các thông tin đã lưu trữ sẽ đượt thiết lập lại (reset) cho lời gọi kế tiếp. Còn khi tiến hành đệm cho Query Builder thì ta có thể ngăn cản việc thiết lập lại cũng như tái sử dụng thông tin một cách dễ dàng.

Những lời gọi đã được đệm là những lời gọi được tích lũy. Nếu ta thực hiện hai lời gọi tới hàm select() đã được đệm và hai lời gọi tới hàm select() không được đệm thì kết quả là ta đã tiến hành bốn lời gọi tới hàm select(). Có ba hàm đệm có thể sử dụng như sau:

$this->db->start_cache()

Hàm này phải được gọi ngay khi bắt đầu đệm. Tất cả các truy vấn Query Builder đúng chuẩn đều sẽ được lưu để sử dụng

$this->db->stop_cache()

Hàm này có thể được gọi để dừng đệm.

$this->db->flush_cache()

Hàm này sẽ xóa tất cả các những gì được lưu trong bộ đệm Query Builder.

Ví dụ về việc sử dụng bộ nhớ đệm

Dưới đây là một ví dụ cơ bản về việc sử dụng bộ đệm cho Query Builder:

$this->db->start_cache();
$this->db->select('field1');
$this->db->stop_cache();
$this->db->get('tablename');
// Sẽ tạo ra:
SELECT `field1` FROM (`tablename`)

$this->db->select('field2');
$this->db->get('tablename');
// Sẽ tạo ra:
SELECT `field1`, `field2` FROM (`tablename`)

$this->db->flush_cache();
$this->db->select('field2');
$this->db->get('tablename');
// Sẽ tạo ra:
SELECT `field2` FROM (`tablename`)

 

Lưu ý
Các câu lệnh trên có thể được đệm như sau: select, from, join, where, like, group_by, having, order_by

Thiết lập lại Query Builder

$this->db->reset_query()

Hàm này cho phép thiết lập lại (resetting) Query Builder giúp bạn có thể làm mới truy vấn mà không cần phải thực thi nó trước thông qua việc sử dụng phương thức như $this->db->get() hay $this->db->insert().

Việc thiết lập lại Query Builder rất hữu dụng trong trường hợp bạn sử dụng nó để tạo truy vấn (ví dụ như $this->db->get_compiled_select()) rồi sau đó thực thi truy vấn đó. Ví dụ:

// Lưu ý rằng tham số thứ hai của phương thức get_compiled_select được đặt là FALSE
$sql = $this->db->select(array('field1','field2'))
                                ->where('field3',5)
                                ->get_compiled_select('mytable', FALSE);

// ...
// Thực hiện điều gì đó mới câu lệnh SQL
// ...

$data = $this->db->get()->result_array();

// Sẽ thực thi và trả về một mảng các kết quả của truy vấn sau:
// SELECT field1, field1 from mytable where field3 = 5;

 

Lưu ý
Hai lời gọi tới get_compiled_select() trong khi ta đang sử dụng chức năng đệm Query Builder và không thiết lập lại các truy vấn thì kết quả là có tới hai lần đệm.

Nguồn: https://codeigniter.com/user_guide/database/query_builder.html

» Tiếp: Form Helper - Phần 1
« Trước: Thư viện Session - Hủy và truy cập dữ liệu Session
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!