PHP thuần dùng để tương tác với database, các bạn sẽ phải kết nối với db và thực hiện hàng loạt truy vấn để gọi dữ liệu xuất hiện. Với các framework đặc biệt như Laravel, các bạn không phải thực hiện các điều trên. Vì Laravel đã cung cấp cho chúng ta một tính năng hữu ích – gọi là Query Builder. Trong bài chia sẻ này, các bạn sẽ tìm hiểu sâu hơn về nó như thế nào.
Query Builder là gì?
Query Builder là một class trong class và cung cấp các phương thức để các bạn thao tác với database dễ dàng và nhanh chóng. Các bạn không phải làm sạch dữ liệu trước khi sử dụng query builder.
Query Builder cung cấp giao thức thuận lợi và linh động khi tạo và thực thi các truy vấn dữ liệu. Nó có thể thực hiện đa số các đầu việc cần tính toán dữ liệu trong ứng dụng của các bạn.
Nó thậm chí còn hoạt động trên toàn bộ hệ cơ sở dữ liệu được hỗ trợ. Query Builder trong Laravel thường sử dụng PDO parameter binding để bảo vệ ứng dụng và loại bỏ rủi ro tấn công từ SQL injection. Do đó, các bạn không nhất thiết xử lý các chuỗi khi truyền vào.
Tìm hiểu về cấu hình database
Để sử dụng Query Builder, các bạn nên cấu hình database có kết nối đến cơ sở dữ liệu. Để cấu hình database, các bạn cần mở file .env:
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=hoclaravel
DB_USERNAME=root
DB_PASSWORD=
- DB_HOST: server chứa mysql của bạn
- DB_PORT: cổng port của mysql (thường để mặc định là 3306)
- DB_DATABASE: tên database của bạn
- DB_USERNAME: username để truy cập vào database của bạn
- DB_PASSWORD: password để truy cập vào database của bạn
Cách sử dụng Query Builder trong Laravel
Lấy tất cả dữ liệu trong bảng
Các bạn thực hiện cú pháp sau:
DB::table('tablename')->get()
Nếu bạn lấy tất cả dữ liệu từ bảng tbl_product, thì sẽ có dòng lệnh:
Route::get('/', function () {
$products = DB::table('tb_product')->get();
print_r($products);
});
Chọn cột trong bảng
Bạn thực hiện cú pháp sau:
DB::table('tablename')->select('columnfirst', 'columnsecond')->get();
Truy vấn có điều kiện
Thực hiện điều kiện bằng:
DB::table('tablename')->where('column', 'filter')->get();
Thực hiện điều kiện lớn hơn:
DB::table('tablename')->where('column', '>', 'filter')->get();
Thực hiện điều kiện nhỏ hơn:
DB::table('tablename')->where('column', '<', 'filter')->get();
Thực hiện điều kiện khác:
Thực hiện điều kiện lồng:
$users = DB::table('users')->where('votes', '>', 100)->orWhere('name', 'John')->get();
Truy vấn tìm kiếm chuỗi:
DB::table('tablename')->where('column', 'like', 'filter')->get();
Thực hiện các loại where khác bằng phương thức whereBetween. Đây là phương thức kiểm tra giá trị của 1 cột nằm giữa 2 giá trị:
$users = DB::table('users')
->whereBetween('votes', [1, 100])->get();
Thực hiện phương thức whereNotBetween là kiểm tra giá trị của 1 cột không nằm trong khoảng 2 giá trị:
$users = DB::table('users')
->whereNotBetween('votes', [1, 100])
->get();
Thực hiện phương thức wherein/whereNotIn là kiểm tra giá trị của 1 cột đó có nằm trong 1 mảng các giá trị hay không:
$users = DB::table('users')
->whereIn('id', [1, 2, 3])
->get();
$users = DB::table('users')
->whereIn('id', [1, 2, 3])
->get();
Thực hiện phương thức whereNull/whereNotNull là kiểm tra giá trị của 1 cột và nó có thể mang lại giá trị null hoặc là không:
$users = DB::table('users')
->whereNull('updated_at')
->get();
$users = DB::table('users')
->whereNotNull('updated_at')
->get();
Thực hiện phương thức whereDate/whereMonth/whereDay/whereYear là kiểm tra giá trị cột thời gian được xác định (ngày, tháng, năm):
$users = DB::table('users')
->whereDate('created_at', '2021-10-10')
->get();
Thực hiện phương thức whereMonth là để kiểm tra giá trị cột thời gian đặc biệt của tháng nào đó trong 1 năm:
$users = DB::table('users')
->whereMonth('created_at', '10')
->get();
Thực hiện phương thức whereDay là để kiểm tra giá trị cột thời gian từng ngày của 1 tháng được truyền vào:
$users = DB::table('users')
->whereDay('created_at', '10')
->get();
Thực hiện phương thức whereYear nhằm kiểm tra giá trị cột thời gian đo lường là năm và được truyền vào:
$users = DB::table('users')
->whereYear('created_at', '2016')
->get();
Thực hiện phương thức whereColumn để kiểm tra giá trị 2 cột bằng nhau:
$users = DB::table('users')
->whereColumn('first_name', 'last_name')
->get();
Bạn cũng có thể truyền một toán tử so sánh vào phương thức:
$users = DB::table('users')
->whereColumn('updated_at', '>', 'created_at')
->get();
Phương thức whereColumn có khả năng được truyền vào 1 mảng các điều kiện. Các điều kiện đó sẽ được nối cùng nhau và sử dụng toán tử and operator:
$users = DB::table('users')
->whereColumn([
['first_name', '=', 'last_name'],
['updated_at', '>', 'created_at']
])->get();
Thực hiện phương thức whereExists là bạn có thể tạo các mệnh đề where exists. Phương thức này chấp nhận tham số là 1 closure. Closure là phần sẽ nhận query builder instance và cho phép bạn định nghĩa truy vấn và được đặt trong mệnh đề.
DB::table('users')
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('orders')
->whereRaw('orders.user_id = users.id');
})
->get();
Truy vấn trên sẽ sinh ra đoạn SQL như thế này:
select * from users
where exists (
select 1 from orders where orders.user_id = users.id
)
Kết nối các bảng (join)
Kết nối bên trong bảng:
$users = DB::table('users')->join('contacts', 'users.id', '=', 'contacts.user_id')->get();
Kết nối bên ngoài bảng:
$users = DB::table('users')->leftjoin('contacts', 'users.id', '=', 'contacts.user_id')->get();
Thực hiện phương thức orderBy là bạn có thể sắp xếp kết quả của truy vấn từ 1 cột cho trước. Tham số đầu tiên của phương thức này nên là cột bạn muốn sắp xếp vào. Tham số thứ nhì là chiều sắp xếp linh hoạt (có thể là asc hoặc desc).
$users = DB::table('users')
->orderBy('name', 'desc')
->get();
Thực hiện phương thức groupBy và having Raw là bạn nhóm các kết quả truy vấn lại với nhau. Bạn thực hiện thao tác tương tự với phương thức where khi áp dụng với phương thức having.
$users = DB::table('users')
->groupBy('account_id')
->having('account_id', '>', 100)
->get();
Chúng ta có thể sử dụng phương thức havingRaw để thiết lập các chuỗi vào trong mệnh đề having. Các bạn có thể tìm toàn bộ các department mà có sales lớn hơn $2,500 chẳng hạn.
$users = DB::table('orders')
->select('department', DB::raw('SUM(price) as total_sales'))
->groupBy('department')
->havingRaw('SUM(price) > 2500')
->get();
Thực hiện phương thức insert, delete và update
Với insert, query builder cung cấp phương thức này để chèn các bản ghi vào trong bảng. Phương thức insert chấp nhận 1 mảng tên các cột và giá trị tương ứng để thêm vào trong.
DB::table('users')->insert(
['email' => '[email protected]', 'votes' => 0]
);
Các bạn cũng có thể chèn từng bản ghi vào bảng với 1 lần gọi phương thức insert bằng các truyền thẳng vào 1 trong các mảng. Mỗi mảng con sẽ đại diện cho 1 dòng và được chèn vào bảng.
DB::table('users')->insert([
['email' => '[email protected]', 'votes' => 0],
['email' => '[email protected]', 'votes' => 0]
]);
Với phương thức update, nó chấp nhận 1 mảng các cặp cột và giá trị có trong cột để tự động cập nhật. Ngoài chèn thêm bản ghi vào database, query builder cũng cập nhật bản ghi có sẵn bằng việc sử dụng phương thức database. Bạn có thể ràng buộc truy vấn update sử dụng mệnh đề where.
DB::table('users')
->where('id', 1)
->update(['votes' => 1]);
Với phương thức delete, nhiệm vụ của nó là để xóa các bản ghi từ bảng. Bạn có thể ràng buộc cú pháp delete thông qua mệnh đề where. Nên thực hiện thao tác này trước khi gọi phương thức delete.
DB::table('users')->delete();
DB::table('users')->where('votes', '>', 100)->delete();
Thực hiện phương thức Unions
Query builder có cung cấp phương thức Unions để chúng ta thực hiện 2 truy vấn với nhau. Ví dụ các bạn có thể tạo 1 truy vấn ban đầu và sau đó sử dụng phương thức Unions để nối nó vào truy vấn thứ nhì.
$first = DB::table('users')
->whereNull('first_name');
$users = DB::table('users')
->whereNull('last_name')
->union($first)
->get();
Vậy là các bạn đã nắm được cách sử dụng một số câu lệnh truy vấn cơ bản trong Query Builder của Laravel. Bạn cần phải kết nối cơ sở dữ liệu để thực hiện các dòng lệnh truy vấn. Nếu bạn truy vấn trong controllers, thì bạn đừng quên khai báo use Illuminate\Support\Facades\DB. Nếu bạn truy vấn trong route, thì có thể giản lược phần đó.
Cập nhật thêm được vài kiến thức mới
Bài viết hữu ích.
Hữu ích
Cảm ơn Admin. Bài viết khá hay !
OK bạn, mình sẽ sắp xếp viết một bài về Extend Validation. Cảm ơn bạn đã quan tâm nhé.