Trick cho Laravel - Đóng gói data gửi về view

PHP Laravel Query Builder – sử dụng Database cơ bản

Hi các bạn, nay sẽ là bài PHP Laravel Query Builder nhé

Như các bạn đã biết truy xuất dữ liệu trên database là một trong những điều quan trọng trong Model

Và Query Builder của Laravel cũng khá dễ để tiếp cận thôi 😀

Chúng ta sẽ bắt đầu nhé.

Mục lục:

  1. Cách sử dụng được PHP Laravel Query Builder
  2. Query lấy thông tin đơn giản (Select)
  3. Điều kiện (Where)
  4. Gán (Join)
  5. Lấy thông tin ra sau khi Query
  6. Tính toán (Aggregates)
  7. Thêm (Insert)
  8. Sửa (Update)
  9. Xóa (Delete)

1/ Cách để sử dụng được PHP Laravel Query Builder:

Rất đơn giản thôi, chỉ cần use library này là các bạn đã có thể xài:

use Illuminate\Support\Facades\DB;

Đặt dưới namespace tương tự các file khác, giờ chúng ta đã có thể kết nối Database và sử dụng.

(Cấu hình MySQL của bạn nằm ở file .env ở thư mục chính nhé)

2/ Query đơn giản (Select)

Rất đơn giản thôi, class DB đã dựng sẵn phương thức tĩnh cho ta sử dụng, chúng ta không cần khởi tạo đâu.

Để query select 1 table đơn giản, như sau:

<?php

$get = DB::table(<tên_table>)->get();

// ví dụ
$get = DB::table('sethPhat')->get();

Đơn giản phải ko nào, nếu là lệnh SQL nó sẽ là: “SELECT * FROM sethPhat”

Và một hàm hoàn chỉnh sẽ như sau:

public function getSethPhat() {
	$get = DB::table('sethPhat')->get();
	return $get;
}

Như thế này ta đã nhận lại giá trị trả về và có thể return để sử dụng.

SELECT COLUMN:

Nếu bạn chỉ cần 1 column nào đó thôi,chúng ta cũng có thể giới hạn bằng hàm select(string column1, string column2,….)

$get = DB::table('sethPhat')
	->select('name', 'email')
	->get();

Như thế này thì mình chỉ lấy ra name và email để sử dụng 😀

SELECT LIMIT:

Không chỉ vậy, chúng ta cũng có thể giới hạn được số rows sẽ lấy ra (LIMIT) bằng method limit(int):

$get = DB::table('sethPhat')
	->limit(8)
	->get();

Như trên, mình đã limit 8 rows và chỉ có 8 rows đầu tiên trong table sẽ được lấy ra.

Ngoài ra phương thức take(int) để lấy, tương tự như method limit(int):

$get = DB::table('sethPhat')
	->take(8)
	->get();

SELECT OFFSET, LIMIT:

Chúng ta cũng có thể chọn số bắt đầu rows(Start) kèm cả limit để lấy ra với phương thức skip(int) và offset(int):

// Phương thức skip
$get = DB::table('sethPhat')
	->skip(5)
	->take(8)
	->get();

// Phương thức Offset
$get = DB::table('sethPhat')
	->offset(5)
	->limit(8)
	->get();

Lưu ý: Skip thì đi với Take, Offset thì đi với Limit nhé 😀

SELECT ORDER BY:

Order By cũng là một trong những query quan trọng để ta lấy rows theo hướng desc/asc của một column nào đó

Chúng ta sử dụng method orderBy(string Column, string “DESC/ASC”) để sử dụng nhé:

$get = DB::table('sethPhat')
		->orderBy('id', 'desc')
		->get();

Như trên thì mình sẽ lấy các bài có id mới nhất.

3/ Điều kiện (Where)

Điều kiện là một phần ko thể thiếu của SQL, chính vì vậy đây cũng là một trong những phần quan trọng

Sử dụng điều kiện rất dễ các bạn ạ, chúng ta dùng method where với nhiều cách khác nhau như sau:

Điều kiện bằng: where(string column, TYPE)

Với cách sử dụng where(TYPE là giá trị của mình cần kiểm tra nhé) này, DB sẽ hiểu là bạn đang kiểm tra điều kiện bằng, vd:

$get = DB::table('sethPhat')
		->where('id', 10)
		->get();

Nếu có rows id = 10, mình sẽ lấy ra được. Tuy nhiên nếu các bạn chắc rằng rows này là duy nhất thì mình khuyên ko nên xài hàm get();

Bởi vì get(); sẽ trả về cho ta 1 mảng rows lấy được, chứ ko phải duy nhất 1

Thay vào đó chúng ta xài hàm first();

$get = DB::table('sethPhat')
		->where('id', 10)
		->first();

Khi đó chúng ta sẽ có $get ở dạng 1 rows duy nhất, không phải là mảng.

Điều kiện nhỏ hơn, lớn hơn,…: where(column, operator, type)

Rất đơn giản như sau

$get = DB::table('sethPhat')
		->where('id', '>=', 10)
		->get();

Như thế này thì mình sẽ lấy ra các rows có id >= 10, các bạn có thể dùng các operator khác nhau như: >=, <=, >, <, =, !=

Điều kiện nằm giữa giá trị: whereBetween(column, array(min, max))

Hàm này sẽ giúp chúng ta kiểm tra một giá trị nằm ở giữa, vd mình sẽ lấy ra tuổi giữa 18-30:

$get = DB::table('sethPhat')
		->whereBetween('age', [18, 30])
		->get();

Không chỉ vậy, ta cũng có thể lấy các rows ko nằm giữa giá trị nào đó bằng hàm whereNotBetween(column, array(min, max))

$get = DB::table('sethPhat')
		->whereNotBetween('age', [18, 30])
		->get();

Các rows có tuổi < 18 và > 30 sẽ được lấy ra.

Điều kiện trong 1 mảng: whereIn(column, array())

Chúng ta có thể kiểm tra 1 column nào có giá trị trong mảng bằng whereIn():

$get = DB::table('sethPhat')
		->whereIn('age', [18, 19, 20, 21])
		->get();

Nếu tuổi có giá trị trong mảng (18,19,20,21) thì sẽ dc lấy ra 😀

Tương tự, ta cũng có thể kiểm tra nếu column đó có giá trị ko nằm trong mảng bằng whereNotIn()

$get = DB::table('sethPhat')
		->whereNotIn('age', [18, 19, 20, 21])
		->get();

Tuổi nào có giá trị như mảng sẽ ko dc lấy ra 😀

Nhiều điều kiện (Where and Where,…)

Khi bạn muốn kiểm tra nhiều điều kiện để cho chắc 1 thứ gì đó, chúng ta có thể truyền vào thông tin như sau:

$get = DB::table('sethPhat')
		->where('name', 'Phat')
		->where('email', '[email protected]')
		->where('age', 21)
		->first();

Tuy nhiên nhìn vậy sẽ ko đẹp lắm fải ko, chúng ta cũng có 1 giải pháp là truyền vào một mảng assoc như sau:

$check1 = [
	'name'	=>	'Phat',
	'email'	=>	'[email protected]',
	'age'	=>	21
];

$get = DB::table('sethPhat')
		->where($check1)
		->first();

Với mảng assoc, chúng ta chỉ được kiểm tra giá trị bằng.

Không chỉ vậy, chúng ta cũng có thể truyền vào một mảng với dạng where tự chọn, thực hiện ở mảng 2 chiều:

$check2 = [
	['age', '>=', 20],
	['id', '<', 100]
];

$get = DB::table('sethPhat')
		->where($check2)
		->get();

Như thế này thì ta sẽ lấy các rows có tuổi >= 20 và id < 100

Điều kiện hoặc (WHERE OR WHERE): orWhere(column, value)/orWhere(column, operator, value)

Chúng ta có thể kiểm tra nếu điều kiện này có hoặc điều kiện kia, như vậy orWhere sẽ sẵn sàng đợi các bạn:

$get = DB::table('sethPhat')
		->where('id', 10)
		->orWhere('name', 'Seth Phat 2')
		->first();

Tương tự với orWhere mà có operator đặc biệt nhé.

4/ Gán (Join, Left Join,…)

Ví dụ mình có 2 table, monHangchuyenMuc. Ở đây món hàng có lưu id_category.

Khi mình get monHang, mình muốn có cả tên chuyên mục, chúng ta có 2 giải pháp:

  1. Viết thêm hàm lấy tên chuyên mục từ ID
  2. Join

Và tất nhiên, cách elegant nhất chính là Join hoặc Left Join, chúng ta có 2 hàm như sau:

  • join(tables, column to check 1, operator, column to check 2)
  • leftJoin(tables, column to check 1, operator, column to check 2)

Left Join tương tự như Join nhé. Và ta sẽ có vd như sau:

$get = DB::table('monHang')
		->orderBy('id', 'desc')
		->join('chuyenMuc', 'monHang.id_category', '=', 'cm.id')
		->first();

Như thế là mình đã lấy dc các mặt hàng mới nhất cùng với tên của Category đi kèm để xuất ra luôn 😀

5/ Lấy thông tin sử dụng sau khi Query xong

Đây là một phần đơn giản :D, khi chúng ta query select xong, 100% là fải lấy ra sử dụng rồi.

Truy xuất phần tử khi query bằng hàm first();

Không giống như mysql hay mysqli của PHP, DB của Laravel sẽ trả về cho ta 1 mảng dữ liệu ở dạng đối tượng Class, nên chúng ta sẽ ko truy xuất theo kiểu cũ

Thay vào đó chúng ta truy xuất như sau, khi mình lấy first() id = 1 của table Users:

$user = DB:table('users')
		->where('id', 1')
		->first();

// Lấy giá trị
$name = $user->name;
$age = $user->age;
$email = $user->email;

Thay vì $user[‘ten_column’] như hồi mysql, mysqli thì chúng ta thay bằng $user->ten_column

Cơ bản thì nhìn đẹp hơn fải ko nào 😀

Duyệt toàn bộ mảng khi query bằng hàm get();

Chúng ta chỉ foreach bình thường thôi 😀

$user = DB:table('users')
		->get();

// foreach
foreach ($user as $infoUser) {
	// sử dụng $infoUser->tên_column
}

Rất dễ fải ko nào 😀

Để cho đỡ rối, các bạn qua tiếp trang 2 nha

facebook
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

Bình luận qua Facebook