Cách select dữ liệu từ DB bằng Active Record Class trên CodeIgniter

CodeIgniter sử dụng một biểu mẫu Active Record Database để cho phép việc lấy, thêm, cập nhật thông tin vào trong Database với số dòng code ngắn nhất. Trong một vài trường hợp chỉ cần 1 hoặc 2 dòng code là có thể thực hiện được một hành động tương tác với dữ liệu trong Database. 

CodeIgniter không yêu cầu phải có một Class riêng cho mỗi bảng trong Database.Do bộ Active Record này cho phép bạn tạo Database độc lập hoàn với các Class của ứng dụng, với các cú pháp truy vấn được sinh ra bởi từng bộ điều phối DB riêng. Đồng thời nó cũng tạo các truy vấn an toàn hơn do hệ thống tự động loại bỏ các ký tự đặc biệt, ký tự nguy hiểm khi truy vấn vào DB.

Nếu các bạn có ý định viết các truy vấn riêng của mình, thì bạn có thể bỏ kích hoạt lớp này trong file cấu hình database.php.

Trong bài này mình sẽ giới thiệu về phương thức liên quan đến việc Select dữ liệu từ DB trong Active Record.

1. Selecting Data.

Các hàm sau cho phép bạn tạo các truy vấn SELECT.

a. Hàm $this->db->get().

Hàm này thực hiện truy vấn chọn - SELECT. Hàm này có thể sử dụng để lấy toàn bộ bản ghi trong một bảng.

$query = $this->db->get('mytable');
// Biến $query trả về: SELECT * FROM mytable

Tham số thứ 2 và thứ 3 của hàm này cho phép bạn thiết lập biến limit(giới hạn), và biến offset(bước nhảy):

$query = $this->db->get('mytable', 10, 20);
// Biến $query trả về: SELECT * FROM mytable LIMIT 20, 10 

Các bạn có thể để ý thấy rằng, hàm này được gán vào biến tên là $query, biến này có thể được sử dụng để hiển thị kết quả trả về:

$query = $this->db->get('mytable');
foreach ($query->result() as $row)
{
    echo $row->title;
}

b. Hàm $this->db->get_where().

Hàm này tương tự như hàm ở trên trừ một cái là nó cho phép bạn chèn thêm một mệnh đề điều kiện "where" ở vị trí tham số thứ 2, thay vì sử dụng hàm $this->db->where().

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

c. Hàm $this->db->select().

Hàm này cho phép bạn đưa ra các trường dữ liệu mà bạn muốn lấy ra từ trong DB.

$this->db->select('title, content, date');
$query = $this->db->get('mytable');
// $query trả về: SELECT title, content, date FROM mytable

Chú ý: Nếu bạn chọn toàn bộ các trường trong DB từ một bảng nào đó thì các bạn không cần truyền tham số vào hàm này. Nếu để trống, thì mặc định là sẽ thực hiện truy vấn SELECT * (All).

Hàm này cũng có phép bạn truyền vào tham số thứ 2 (không bắt buộc). Nếu bạn thiết lập hàm này là FALSE, CodeIgniter sẽ không tự dộng thêm dấu `` vào câu truy vấn của bạn. Điều này rất hữu ích khi truy vấn lồng nhau để kết hợp các truy vấn.

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

d. Hàm $this->db->select_max().

Hàm này tạo ra biểu thức "SELECT MAX(field)" trong truy vấn của bạn. 

$this->db->select_max('age');
$query = $this->db->get('members');
// Produces: SELECT MAX(age) as age FROM members
$this->db->select_max('age', 'member_age');
$query = $this->db->get('members');
// Sinh ra: SELECT MAX(age) as member_age FROM members

g. Hàm $this->db->select_min().

Hàm này tạo ra biểu thức "SELECT MIN(field)" trong truy vấn của bạn. 

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

f. Hàm $this->db->select_avg().

Hàm này tạo ra biểu thức "SELECT AVG(field)" trong truy vấn của bạn.

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

g. Hàm $this->db->select_sum().

Hàm này tạo ra biểu thức "SELECT SUM(field)" trong truy vấn của bạn.

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

h. Hàm $this->db->from().

Hàm này cho phép bạn tạo ra biểu thức FROM trong truy vấn của bạn.

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

i. Hàm $this->db->join().

Hàm này cho phép bạn sinh ra thành phần JOIN trong truy vấn của bạn.

$this->db->select('*');
$this->db->from('blogs');
$this->db->join('comments', 'comments.id = blogs.id');
$query = $this->db->get();
// Trả về: 
// SELECT * FROM blogs
// JOIN comments ON comments.id = blogs.id

Nếu các bạn muốn chỉ rõ kiểu JOIN muốn sử dụng trong truy vấn, thì bạn cần truyền vào tham số thứ 3. Các thiết lập có thể có là : left, right, outer, inner, left outer, và right outer.

$this->db->join('comments', 'comments.id = blogs.id', 'left');
// Trả về: LEFT JOIN comments ON comments.id = blogs.id

j. Hàm $this->db->where().

Hàm này sinh ra thành phần WHERE trong truy vấn của bạn. Hàm này có thể thiết lập theo một trong 4 cách sau:

j1. Khóa và giá trị đơn giản:

$this->db->where('name', $name); 
// Trả về: WHERE name = 'Joe'.

Chú ý rằng dấu = được tự động thêm vào . Nếu bạn sử dụng truy vấn với nhiều mệnh đề WHERE với toán tử AND thì các bạn có thể dùng:

$this->db->where('name', $name);
$this->db->where('title', $title);
$this->db->where('status', $status); 
// tương đương với WHERE name = 'Joe' AND title = 'boss' AND status = 'active'

j2. Khóa và giá trị tùy biến:

Các bạn có thể truyền thêm toán tử vào trong tham số đầu của hàm để điều khiển việc so sánh:

$this->db->where('name !=', $name);
$this->db->where('id <', $id); 
// Trả về: WHERE name != 'Joe' AND id < 45

j3. Mảng kết hợp:

$array = array('name' => $name, 'title' => $title, 'status' => $status);
$this->db->where($array); 
// Trả về: WHERE name = 'Joe' AND title = 'boss' AND status = 'active'

Các bạn cũng có thể đưa thêm toán tử riêng vào trong phương thức này:

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

j4. Chuỗi tùy biến:

Các bạn có thể viết các mệnh đề riêng của mình:

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

Hàm $this->db->where() chấp nhận một tham số thứ 3 kiểu boolean. Nếu thiết lập là FALSE, CodeIgniter sẽ không thêm dấu `` vào câu truy vấn của bạn.

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

k. Hàm $this->db->or_where().

Hàm này tương tự hàm ở trên, trừ việc là các mẫu truy vấn được liên kết bằng toán tử OR.

$this->db->where('name !=', $name);
$this->db->or_where('id >', $id); 
// Trả về: WHERE name != 'Joe' OR id > 50

l. Hàm $this->db->where_in().

Sinh ra biểu thức WHERE field IN() kết hợp với toán tử AND trong truy vấn của bạn. 

$names = array('Frank', 'Todd', 'James');
$this->db->where_in('username', $names);
// Trả về: WHERE username IN ('Frank', 'Todd', 'James')

m. Hàm $this->db->or_where_in().

Sinh ra biểu thức WHERE field IN() kết hợp với toán tử OR trong truy vấn của bạn. 

$names = array('Frank', 'Todd', 'James');
$this->db->or_where_in('username', $names);
// Trả về: OR username IN ('Frank', 'Todd', 'James')

n. Hàm $this->db->where_not_in().

Sinh ra biểu thức WHERE field NOT IN() kết hợp với toán tử AND trong truy vấn của bạn. 

$names = array('Frank', 'Todd', 'James');
$this->db->where_not_in('username', $names);
// Trả về: WHERE username NOT IN ('Frank', 'Todd', 'James')

o. Hàm $this->db->like().

Hàm này cho phép bạn tạo ra mệnh đề LIKE trong truy vấn, rất hữu dụng cho việc tìm kiếm dữ liệu.

o.1. Khóa và giá trị đơn giản.

$this->db->like('title', 'match'); 
// Trả về: WHERE title LIKE '%match%'

Nếu bạn muốn gọi nhiều biểu thức liền nhau, bạn có thể nối chúng bằng toán tử AND.

$this->db->like('title', 'match');
$this->db->like('body', 'match'); 
// WHERE title LIKE '%match%' AND body LIKE '%match%

Nếu các bạn muốn tìm kiếm gần giống cùng ký tự '%', các bạn có thể sử dụng thêm tham số thứ 3 (không bắt buộc). Các thiết lập có thể có là : 'before', 'after', 'both'.

$this->db->like('title', 'match', 'before'); 
// Trả về: WHERE title LIKE '%match' -> tìm các từ kết thúc là từ match
$this->db->like('title', 'match', 'after'); 
// Produces: WHERE title LIKE 'match%' -> tìm các từ bắt đầu là từ match

$this->db->like('title', 'match', 'both');  // Produces: WHERE title LIKE '%match%' -> tìm các từ có chứa từ match

Nếu các bạn không muốn tìm gần đúng, thì các bạn có thể truyền tham số thứ 3 là 'none'.

$this->db->like('title', 'match', 'none'); 
// Trả về: WHERE title LIKE 'match'

o.2. Mảng kết hợp.

Thay vì việc phải nối các biểu thức bằng toán tử AND, ta có thể dùng một mảng để truyền giá trị điều kiện vào.

$array = array('title' => $match, 'page1' => $match, 'page2' => $match);
$this->db->like($array); 
// WHERE title LIKE '%match%' AND page1 LIKE '%match%' AND page2 LIKE '%match%'

p. Hàm $this->db->or_like().

Hàm này tương tự như hàm like() ở trên, trừ một cái là nó sử dụng kết hợp với toán tử OR.

$this->db->like('title', 'match');
$this->db->or_like('body', $match); 
// WHERE title LIKE '%match%' OR body LIKE '%match%'

q. Hàm $this->db->not_like().

Hàm này là hàm ngược của hàm like() ở trên. Nó tạo ra thành phần NOT LIKE trong truy vấn.

$this->db->not_like('title', 'match');
// WHERE title NOT LIKE '%match%

r. Hàm $this->db->or_not_like().

Hàm này tương tự hàm not_like(), nhưng nó kết hợp thêm toán tử OR vào trong truy vấn.

$this->db->like('title', 'match');
$this->db->or_not_like('body', 'match'); 
// WHERE title LIKE '%match% OR body NOT LIKE '%match%'

s. Hàm $this->db->group_by().

Hàm này cho phép bạn tạo ra thành phần GROUP BY trong truy vấn.

$this->db->group_by("title"); 
// Trả về: GROUP BY title

Bạn cũng có thể truyền một mảng giá trị vào.

$this->db->group_by(array("title", "date")); 
// Trả về: GROUP BY title, date

t. Hàm $this->db->distinct().

Tạo ra thành phần DISTINCT trong truy vấn.

$this->db->distinct();
$this->db->get('table');
// Trả về: SELECT DISTINCT * FROM table

u. Hàm $this->db->having().

Tạo ra thành phần HAVING trong truy vấn. Bạn có thể sử dụng một trong 2 cú pháp sau.

$this->db->having('user_id = 45'); 
// Trả về: HAVING user_id = 45

$this->db->having('user_id', 45); 
// Trả về: HAVING user_id = 45

Bạn cũng có thể truyền vào một mảng giá trị.

$this->db->having(array('title =' => 'My Title', 'id <' => $id)); 
// Trả về: HAVING title = 'My Title', id < 45

v. Hàm $this->db->or_having().

Hàm này giống như hàm ở trên, nhưng có kết hợp thêm với toán tử OR.

w. Hàm $this->db->order_by().

Hàm này cho phép bạn thiết lập một mệnh đề ORDER BY. Tham số đầu tiên chứa tên của cột mà bạn muốn sắp xếp. Tham số thứ hai cho phép bạn xác định chiều sắp xếp. Có các lựa chọn là 'ASC', 'DESC' hoặc 'RANDOM'.

$this->db->order_by("title", "desc"); 
// Trả về: ORDER BY title DESC

Các bạn có thể truyền một chuỗi vào tham số thứ 1.

$this->db->order_by('title desc, name asc'); 
// Trả về: ORDER BY title DESC, name ASC

Các bạn có thể gọi đến nhiều lần hàm này để sắp xếp theo nhiều trường.

$this->db->order_by("title", "desc");
$this->db->order_by("name", "asc"); 
// Trả về: ORDER BY title DESC, name ASC

x. Hàm $this->db->limit().

Hàm này cho phép bạn giới hạn số kết quả trả về từ truy vấn.

$this->db->limit(10);
// Trả về: LIMIT 10

Tham số thứ 2 cho phép bạn thiết lập điểm khởi đầu của kết quả cần lấy.

$this->db->limit(10, 20);
// Trả về: LIMIT 20, 10 -> lấy kết quả bắt đầu từ giá trị ở vị trí thứ 20 và lấy thêm 9 giá trị ngay sau nó.

y. Hàm $this->db->count_all_results().

Hàm này cho phép bạn xác định số hàng dữ liệu trả về trong truy vấn. 

echo $this->db->count_all_results('my_table');
// Trả về một số nguyên, ví dụ như : 25
$this->db->like('title', 'match');
$this->db->from('my_table');
echo $this->db->count_all_results();
// Trả về 1 số nguyên, ví dụ như : 17

z. Hàm $this->db->count_all().

Hàm này xác định số lượng hàng trong một bảng.

echo $this->db->count_all('my_table');
// Trả về một số nguyên, ví dụ như 25.

Trong bài lần tới mình sẽ trình bày về các phương thức liên quan tới Insert và Delete dữ liệu trong DB.

Chúc các bạn thành công :)