Eloquent là ORM (Object-Relational Mapping) mạnh mẽ tích hợp sẵn trong Laravel, cho phép bạn làm việc với cơ sở dữ liệu một cách dễ dàng và tự nhiên bằng cách sử dụng các mô hình (models) thay vì phải viết các truy vấn SQL thủ công. Eloquent Models đại diện cho các bảng trong cơ sở dữ liệu và mỗi đối tượng của model đại diện cho một bản ghi (row) trong bảng đó.
Eloquent giúp bạn thực hiện các thao tác như truy vấn dữ liệu, thêm, sửa, xóa bản ghi một cách đơn giản và rõ ràng bằng cách sử dụng các phương thức trong mô hình thay vì phải sử dụng SQL phức tạp. Nó giúp mã trở nên dễ đọc, dễ bảo trì và ít lỗi hơn.
1. Mục đích và vai trò của Eloquent Models
1.1. Mô hình hóa dữ liệu
Eloquent Models trong Laravel cho phép bạn mô hình hóa cấu trúc dữ liệu trong cơ sở dữ liệu. Mỗi bảng cơ sở dữ liệu có thể được đại diện bằng một model tương ứng. Ví dụ, bảng users
có thể được đại diện bởi model User
. Eloquent Models giúp bạn tương tác với bảng này mà không cần phải viết câu truy vấn SQL thủ công.
1.2. Tương tác với cơ sở dữ liệu thông qua phương thức hướng đối tượng
Eloquent giúp bạn tương tác với cơ sở dữ liệu một cách tự nhiên bằng cách cung cấp các phương thức hướng đối tượng. Các phương thức này được gọi từ model để thực hiện các thao tác như thêm mới, chỉnh sửa, hoặc truy vấn dữ liệu.
Ví dụ, thay vì viết câu truy vấn SQL như:
Bạn chỉ cần sử dụng phương thức Eloquent như sau:
2. Cấu trúc của một Eloquent Model
Eloquent Model là một lớp PHP đại diện cho bảng trong cơ sở dữ liệu và chứa các thuộc tính, phương thức để tương tác với dữ liệu. Mỗi model kế thừa từ lớp IlluminateDatabaseEloquentModel
.
Ví dụ cơ bản về một model:
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class User extends Model {
// Các thuộc tính và phương thức liên quan đến bảng 'users'
}
Model trên sẽ tương ứng với bảng users
trong cơ sở dữ liệu. Mỗi đối tượng của model User
đại diện cho một bản ghi trong bảng đó.
2.1. Thuộc tính fillable
và guarded
$fillable
: Đây là một mảng chứa danh sách các trường cho phép gán hàng loạt (mass assignment). Điều này giúp bảo vệ các trường không mong muốn khỏi việc được gán tự động.
protected $fillable = ['name', 'email', 'password'];
$guarded
: Là mảng các trường không được phép gán giá trị hàng loạt. Nếu sử dụng $guarded
, tất cả các trường khác đều có thể được gán.
protected $guarded = ['id'];
2.2. Thuộc tính table
Mặc định, Eloquent sẽ suy luận tên bảng từ tên model bằng cách sử dụng dạng số nhiều của model (ví dụ, model User
sẽ tương ứng với bảng users
). Tuy nhiên, bạn có thể chỉ định tên bảng thủ công nếu cần.
protected $table = 'my_users';
2.3. Timestamps
Mặc định, Eloquent sẽ tự động quản lý hai cột created_at
và updated_at
để theo dõi thời gian tạo và chỉnh sửa bản ghi. Bạn có thể tắt tính năng này bằng cách đặt thuộc tính $timestamps
thành false
.
public $timestamps = false;
3. Các thao tác CRUD với Eloquent
Eloquent hỗ trợ đầy đủ các thao tác cơ bản của cơ sở dữ liệu (CRUD: Create, Read, Update, Delete).
3.1. Tạo bản ghi (Create)
Bạn có thể tạo một bản ghi mới bằng cách khởi tạo một đối tượng model và sau đó gọi phương thức save()
:
$user = new User;
$user->name = 'John Doe';
$user->email = '[email protected]';
$user->save();
Hoặc bạn có thể sử dụng phương thức create()
nếu đã định nghĩa $fillable
:
User::create([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => bcrypt('password')
]);
3.2. Đọc dữ liệu (Read)
Để lấy dữ liệu từ cơ sở dữ liệu, bạn có thể sử dụng các phương thức như all()
, find()
, where()
, và first()
.
// Lấy tất cả người dùng
$users = User::all();
// Lấy người dùng với id = 1
$user = User::find(1);
// Tìm người dùng có email là [email protected]
$user = User::where('email', '[email protected]')->first();
3.3. Cập nhật bản ghi (Update)
Sau khi lấy một bản ghi, bạn có thể cập nhật giá trị của nó và gọi phương thức save()
.
$user = User::find(1);
$user->name = 'Jane Doe';
$user->save();
Hoặc sử dụng phương thức update()
để cập nhật nhiều trường cùng lúc:
User::where('id', 1)->update(['name' => 'Jane Doe']);
3.4. Xóa bản ghi (Delete)
Để xóa một bản ghi, bạn có thể sử dụng phương thức delete()
trên đối tượng model:
$user = User::find(1);
$user->delete();
Hoặc xóa theo điều kiện:
4. Quan hệ giữa các bảng trong Eloquent
Eloquent cung cấp các phương thức để định nghĩa và quản lý các quan hệ giữa các bảng trong cơ sở dữ liệu, chẳng hạn như:
- One to One: Quan hệ một – một.
- One to Many: Quan hệ một – nhiều.
- Many to Many: Quan hệ nhiều – nhiều.
- Has Many Through: Quan hệ qua trung gian.
Ví dụ, quan hệ một-nhiều giữa User
và Post
(một người dùng có nhiều bài viết):
class User extends Model {
public function posts() {
return $this->hasMany(Post::class);
}
}
Sau đó, bạn có thể lấy các bài viết của một người dùng cụ thể:
$user = User::find(1);
$posts = $user->posts;
5. Eloquent Query Builder
Eloquent được xây dựng trên Query Builder, cho phép bạn tạo ra các truy vấn SQL phức tạp một cách dễ dàng và linh hoạt. Bạn có thể kết hợp các điều kiện và câu lệnh truy vấn để tạo ra các câu truy vấn mạnh mẽ, ví dụ như:
$users = User::where('active', 1)
->orderBy('created_at', 'desc')
->take(10)
->get();
6. Kết luận
Eloquent Models trong Laravel giúp đơn giản hóa quá trình làm việc với cơ sở dữ liệu thông qua các phương thức hướng đối tượng thay vì phải viết truy vấn SQL thủ công. Nó cung cấp một cách tiếp cận trực quan và mạnh mẽ để tương tác với cơ sở dữ liệu, từ đó cải thiện khả năng phát triển, bảo trì và mở rộng của ứng dụng. Nhờ vào các phương thức mạnh mẽ như truy vấn linh hoạt, quản lý quan hệ và khả năng thao tác dữ liệu dễ dàng, Eloquent là một trong những tính năng quan trọng của Laravel.