Sau khi đã làm quen với Eloquent Model và các thao tác CRUD cơ bản, chúng ta sẽ học cách truy vấn dữ liệu bằng Query Builder.
Query Builder cung cấp một cú pháp trực quan, dễ đọc và an toàn, giúp xây dựng các câu lệnh SQL mà không cần viết SQL thủ công.
Laravel sẽ tự động chuyển đổi các phương thức thành câu lệnh SQL tương ứng.
Query Builder là gì?
Query Builder là một thành phần của Laravel dùng để thao tác với cơ sở dữ liệu thông qua các phương thức PHP.
Ví dụ thay vì viết SQL:
SELECT * FROM posts WHERE id = 1;
Ta có thể viết:
Post::where('id', 1)->get();
hoặc
DB::table('posts')
->where('id', 1)
->get();
Hai cách trên đều tạo ra câu lệnh SQL tương tự.
where()
Điều kiện đơn giản nhất là where().
Lấy tất cả bài viết có id bằng 5:
$posts = Post::where('id', 5)->get();
Hoặc tìm theo tiêu đề:
$posts = Post::where('title', 'Laravel 12')->get();
Có thể sử dụng các toán tử so sánh:
$posts = Post::where('id', '>', 10)->get();
Một số toán tử thường dùng:
=
<
=
<=
!=
<>
Nhiều điều kiện
Có thể kết hợp nhiều where().
$posts = Post::where('status', 1)
->where('views', '>', 100)
->get();
Laravel sẽ tạo SQL tương đương:
WHERE status = 1
AND views > 100
orWhere()
Nếu muốn sử dụng điều kiện OR:
$posts = Post::where('category_id', 1)
->orWhere('category_id', 2)
->get();
SQL tương đương:
WHERE category_id = 1
OR category_id = 2
Có thể kết hợp nhiều điều kiện để tạo các truy vấn phức tạp hơn.
orderBy()
Sắp xếp dữ liệu theo cột.
Tăng dần:
$posts = Post::orderBy('title')->get();
Giảm dần:
$posts = Post::orderBy('created_at', 'desc')->get();
Hoặc:
$posts = Post::orderBy('id', 'asc')->get();
latest()
Trong Laravel, latest() là cách viết ngắn gọn của:
orderBy('created_at', 'desc')
Ví dụ:
$posts = Post::latest()->get();
Nếu muốn sắp xếp theo cột khác:
$posts = Post::latest('id')->get();
Điều này rất hữu ích khi hiển thị các bài viết mới nhất.
paginate()
Khi số lượng dữ liệu lớn, không nên lấy toàn bộ bằng get().
Laravel hỗ trợ phân trang rất đơn giản.
$posts = Post::paginate(10);
Mỗi trang sẽ hiển thị 10 bản ghi.
Trong Blade:
@foreach($posts as $post)
@endforeach
{{ $posts->links() }}
Laravel sẽ tự sinh giao diện phân trang.
Kết hợp nhiều phương thức
Điểm mạnh của Query Builder là có thể nối nhiều phương thức liên tiếp.
Ví dụ:
$posts = Post::where('status', 1)
->where('views', '>', 100)
->latest()
->paginate(10);
Laravel sẽ lần lượt:
Lọc các bài viết đã xuất bản.
Chỉ lấy bài có trên 100 lượt xem.
Sắp xếp mới nhất trước.
Phân trang 10 bài mỗi trang.
Toàn bộ truy vấn chỉ cần một câu lệnh ngắn gọn, dễ đọc và dễ bảo trì.
Query Builder hay Eloquent?
Trong khóa học này, chúng ta chủ yếu sử dụng Eloquent vì cú pháp gần gũi với mô hình hướng đối tượng.
Tuy nhiên, Query Builder vẫn là nền tảng mà Eloquent sử dụng phía dưới. Khi dự án lớn hơn hoặc cần tối ưu truy vấn, việc hiểu Query Builder sẽ giúp bạn làm việc hiệu quả hơn.
Tổng kết
Trong bài này chúng ta đã tìm hiểu:
where()để lọc dữ liệu.orWhere()để kết hợp điều kiện OR.orderBy()để sắp xếp dữ liệu.latest()để lấy dữ liệu mới nhất.paginate()để phân trang.
Đây là những phương thức được sử dụng hằng ngày trong hầu hết các dự án Laravel.
Bài tập
Hiển thị tất cả bài viết có
status = 1.Lấy các bài viết có
id > 10.Sắp xếp danh sách bài viết theo tiêu đề từ A → Z.
Hiển thị các bài viết mới nhất.
Phân trang với 5 bài viết trên mỗi trang.
Viết một truy vấn lấy các bài viết có
status = 1, sắp xếp mới nhất và phân trang 10 bản ghi.
Bài tiếp theo
Ở bài sau chúng ta sẽ tìm hiểu Relationship One To One, bước đầu xây dựng mối quan hệ giữa các Model trong Laravel.
Ở bài 13, khóa học sẽ chuyển sang một chủ đề rất quan trọng của Eloquent ORM: Relationship, bắt đầu với quan hệ One To One.
x1




Không có nhận xét nào:
Đăng nhận xét