Laravel Eloquent là ORM được tích hợp sẵn trong Laravel, cho phép lập trình viên tương tác với cơ sở dữ liệu thông qua các Model thay vì phải viết trực tiếp nhiều câu lệnh SQL. Với cú pháp trực quan cùng khả năng hỗ trợ CRUD, Relationships, Query và nhiều tính năng khác, Eloquent giúp quá trình phát triển ứng dụng Laravel nhanh và dễ bảo trì hơn.
Laravel Eloquent là gì?
Laravel Eloquent là Object-Relational Mapping (ORM) được tích hợp sẵn trong Framework Laravel. Eloquent cho phép mỗi bảng trong database được đại diện bởi một Model tương ứng. Thay vì viết SQL trực tiếp cho những thao tác phổ biến, lập trình viên có thể sử dụng các phương thức PHP để truy vấn và xử lý dữ liệu.
Ví dụ, thay vì viết: SELECT * FROM posts;
Eloquent cho phép sử dụng: $posts = Post::all();
Hoặc lấy bài viết mới nhất: $posts = Post::latest()->get();
Eloquent sẽ chuyển các thao tác này thành câu SQL phù hợp để thực thi trên database.
Có thể hình dung:
PHP Code
↓
Eloquent Model
↓
Eloquent ORM
↓
SQL Query
↓
Database
Đây là một trong những thành phần quan trọng nhất khi làm việc với dữ liệu trong Laravel.
ORM là gì?
ORM là viết tắt của Object-Relational Mapping, một kỹ thuật ánh xạ dữ liệu giữa hệ quản trị cơ sở dữ liệu quan hệ và các đối tượng trong code. Nếu không sử dụng ORM, lập trình viên thường phải làm việc trực tiếp với SQL: SELECT * FROM users WHERE id = 10; Khi sử dụng ORM, có thể viết “$user = User::find(10);” Thay vì thao tác trực tiếp với bảng và dòng dữ liệu, lập trình viên làm việc với các đối tượng PHP.
Ví dụ:
$user->name;
$user->email;
Cách tiếp cận này giúp code gần với tư duy lập trình hướng đối tượng hơn.
Laravel Eloquent hoạt động như thế nào?
Eloquent sử dụng Model để đại diện cho các bảng trong database.
Giả sử database có bảng: posts
Bạn có thể tạo Model: php artisan make:model Post
Laravel tạo file: app/Models/Post.php
Model cơ bản:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
//
}
Theo quy ước mặc định, Eloquent sẽ hiểu Model Post tương ứng với bảng posts.
Sau đó có thể thực hiện: $posts = Post::all();
hoặc: $post = Post::find(1);
Eloquent đảm nhiệm phần lớn công việc ánh xạ giữa Model và database.
Laravel Eloquent Model là gì?
Eloquent Model là lớp PHP đại diện cho một bảng hoặc nguồn dữ liệu trong database.
Ví dụ:
class Product extends Model
{
//
}
Model Product mặc định tương ứng với bảng: products
Một Model có thể được sử dụng để:
- Truy vấn dữ liệu.
- Tạo bản ghi.
- Cập nhật dữ liệu.
- Xóa dữ liệu.
- Định nghĩa Relationships.
- Định nghĩa Accessor và Mutator.
- Sử dụng Query Scope.
- Xử lý các sự kiện của Model.
Khi dự án có nhiều bảng, mỗi Model giúp ứng dụng tổ chức dữ liệu theo cách rõ ràng hơn.
CRUD với Laravel Eloquent
Một trong những lý do Eloquent được sử dụng rộng rãi là khả năng thực hiện CRUD bằng cú pháp tương đối đơn giản.
CRUD bao gồm:
- Create: Tạo dữ liệu.
- Read: Đọc dữ liệu.
- Update: Cập nhật dữ liệu.
- Delete: Xóa dữ liệu.
Create – Thêm dữ liệu
Có thể tạo một Model mới:
$post = new Post();
$post->title = ‘Laravel Eloquent’;
$post->content = ‘Nội dung bài viết’;
$post->save();
Hoặc sử dụng create():
Post::create([
‘title’ => ‘Laravel Eloquent’,
‘content’ => ‘Nội dung bài viết’
]);
Khi sử dụng create(), cần cấu hình Mass Assignment phù hợp trong Model.
Read – Đọc dữ liệu
Lấy toàn bộ dữ liệu: $posts = Post::all();
Tìm theo ID: $post = Post::find(1);
Tìm và trả về lỗi nếu không tồn tại: $post = Post::findOrFail(1);
Lấy bản ghi đầu tiên: $post = Post::first();
Update – Cập nhật dữ liệu
Có thể cập nhật trực tiếp trên Model:
$post = Post::find(1);
$post->title = ‘Tiêu đề mới’;
$post->save();
Hoặc:
$post->update([
‘title’ => ‘Tiêu đề mới’
]);
Delete – Xóa dữ liệu
Xóa một bản ghi:
$post = Post::find(1);
$post->delete();
Hoặc:
Post::destroy(1);
Eloquent cũng hỗ trợ Soft Delete, cho phép đánh dấu bản ghi đã bị xóa thay vì xóa hoàn toàn khỏi database.
Truy vấn dữ liệu với Eloquent
Eloquent cung cấp nhiều phương thức để xây dựng query.
Ví dụ lấy các bài viết đã xuất bản: $posts = Post::where(‘status’, ‘published’)->get();
Có thể kết hợp nhiều điều kiện: $posts = Post::where(‘status’, ‘published’)
->where(‘category_id’, 2)
->get();
Sắp xếp: $posts = Post::orderBy(‘created_at’, ‘desc’)->get();
Phân trang: $posts = Post::latest()->paginate(10);
Có thể kết hợp nhiều phương thức để tạo query phức tạp hơn mà không cần tự viết toàn bộ câu SQL.
Eloquent Relationships là gì?
Một trong những tính năng mạnh nhất của Eloquent là Relationships.
Trong database, các bảng thường có mối quan hệ với nhau.
Ví dụ:
User
↓
Posts
Một User có thể có nhiều Post.
Trong Model User:
public function posts()
{
return $this->hasMany(Post::class);
}
Sau đó có thể lấy bài viết của User: $user->posts;
One To One
Một User có một Profile:
public function profile()
{
return $this->hasOne(Profile::class);
}
One To Many
Một User có nhiều Post:
public function posts()
{
return $this->hasMany(Post::class);
}
Belongs To
Một Post thuộc về một User:
public function user()
{
return $this->belongsTo(User::class);
}
Many To Many
Ví dụ một Post có nhiều Tag và một Tag có nhiều Post:
public function tags()
{
return $this->belongsToMany(Tag::class);
}
Nhờ Relationships, việc truy cập dữ liệu liên quan trở nên trực quan:
$post->user;
$post->tags;
$user->posts;
Đây cũng là phần nên được thực hành kỹ khi học Laravel, bởi Relationships xuất hiện rất thường xuyên trong các ứng dụng có nhiều bảng dữ liệu.
Ưu điểm của Laravel Eloquent
Cú pháp dễ đọc
Thay vì phải viết nhiều SQL: SELECT * FROM posts WHERE status = ‘published’;
có thể viết: Post::where(‘status’, ‘published’)->get();
Cách viết này gần với tư duy lập trình hướng đối tượng.
Hỗ trợ Relationships mạnh
Eloquent giúp mô hình hóa quan hệ giữa các bảng thông qua:
- hasOne
- hasMany
- belongsTo
- belongsToMany
- hasManyThrough
- Polymorphic Relationships
Đây là lợi thế lớn khi làm việc với database có cấu trúc phức tạp. Nếu đang xây dựng nền tảng kiến thức về Laravel, bạn có thể xem thêm Laravel cơ bản để củng cố các khái niệm Model, Migration và database trước khi đi sâu vào những Relationship phức tạp hơn.
Tích hợp sâu với Laravel
Eloquent hoạt động chặt chẽ với nhiều thành phần khác như:
- Validation
- Pagination
- Authentication
- Authorization
- API Resources
- Queues
- Events
Nhờ đó, developer có thể xây dựng ứng dụng mà không cần kết nối thủ công quá nhiều thành phần.
Hỗ trợ mở rộng
Khi dự án phát triển, Eloquent cung cấp nhiều công cụ như Scope, Relationship, Cast, Event và Accessor để tổ chức logic liên quan đến dữ liệu.
Eloquent có thay thế hoàn toàn SQL không?
Câu trả lời là không. Eloquent giúp giảm nhu cầu viết SQL trực tiếp nhưng không có nghĩa SQL trở nên không cần thiết. Trong những truy vấn đơn giản: Post::where(‘status’, ‘published’)->get();
Eloquent rất thuận tiện, nhưng với những truy vấn đặc biệt phức tạp, việc sử dụng Query Builder hoặc SQL trực tiếp có thể phù hợp hơn. Quan trọng là lựa chọn công cụ theo nhu cầu thay vì cố gắng sử dụng Eloquent cho mọi truy vấn.
Khi nào nên sử dụng Laravel Eloquent?
Eloquent đặc biệt phù hợp với:
- Website doanh nghiệp.
- Blog và website nội dung.
- Website thương mại điện tử.
- Hệ thống quản trị.
- Ứng dụng CRUD.
- REST API.
- Hệ thống có nhiều quan hệ giữa các bảng.
Nếu ứng dụng sử dụng database quan hệ và có nhiều thao tác với Model, Eloquent gần như là một trong những thành phần đầu tiên cần tìm hiểu.nTrong quá trình học, nên kết hợp Eloquent với kiến thức về Migration, Model, Relationship và Query để hiểu đầy đủ cách Laravel làm việc với database.
Những lưu ý khi sử dụng Eloquent
Tránh truy vấn trong vòng lặp không cần thiết
Đoạn code như:
foreach ($posts as $post) {
$post->user;
}
có thể tạo ra nhiều query nếu Relationship chưa được eager load. Nên cân nhắc “Post::with(‘user’)->get();” khi dữ liệu liên quan cần được sử dụng hàng loạt.
Không lạm dụng Model
Model không nên trở thành nơi chứa toàn bộ business logic của ứng dụng. Với nghiệp vụ phức tạp, có thể kết hợp Service hoặc các lớp phù hợp để phân tách trách nhiệm.
Chú ý số lượng dữ liệu
Không nên sử dụng “Post::all();” khi bảng có hàng trăm nghìn hoặc hàng triệu bản ghi mà chỉ cần một phần dữ liệu. Trong trường hợp đó, nên cân nhắc “Post::paginate(20);” hoặc các phương thức như chunk(), lazy() tùy nhu cầu xử lý.
Kết luận
Laravel Eloquent là ORM được tích hợp sâu trong Laravel, giúp lập trình viên thao tác với database thông qua Model và cú pháp PHP trực quan thay vì phải viết SQL cho mọi thao tác. Điểm mạnh của Eloquent không chỉ nằm ở việc rút gọn câu lệnh truy vấn mà còn ở khả năng kết nối chặt chẽ giữa Model, database và các thành phần khác của Laravel. Khi sử dụng đúng cách, Eloquent giúp code dễ đọc, dễ bảo trì và phù hợp với nhiều loại ứng dụng PHP hiện đại.
