Trong bài viết này, chúng ta sẽ cùng đi tìm hiểu Eloquent ORM là gì, và tạo sao chúng ta nên sử dụng nó để làm việc với Database. Let’s go!
Eloquent là một trình ánh xạ quan hệ đối tượng (ORM) giúp bạn tương tác với cơ sở dữ liệu dễ dàng hơn. Khi sử dụng Eloquent, mỗi bảng cơ sở dữ liệu có một “Mô hình” (Model) tương ứng được sử dụng để tương tác với bảng đó. Ngoài việc truy xuất các bản ghi từ bảng cơ sở dữ liệu, các mô hình Eloquent cũng cho phép bạn chèn, cập nhật và xóa các bản ghi khỏi bảng.
Nguyên văn định nghĩa Eloquent như trên, có vẻ hơi khó hiểu nhỉ, hãy cùng thực tế như sau:
Giả sử, bạn muốn lấy danh sách tất cả bản ghi trong 1 bảng custom, bạn có thể viết theo cách sau:
global $wpdb;
$records = $wpdb->get_results("SELECT * FROM custom_table");
Nhưng, với Eloquent bạn có thể viết như sau:
$records = CustomTableModel::all()->toArray();
Yeah! Ngắn gọn phải không?
Hay ví dụ bạn muốn lấy tất cả bài viết publish của user có role là editor, cấu trúc DB như sau:
posts:
- id
- post_title
- author_id
- post_status
author_meta:
- id
- author_id
- meta_key
- meta_value
Nếu viết theo $wpdb sẽ như sau:
global $wpdb;
$records = $wpdb->get_results("
SELECT * FROM posts
LEFT JOIN author_meta ON posts.author_id = author_meta.author_id
WHERE author_meta.meta_key = 'role'
AND author_meta.meta_value = 'editor'
AND posts.post_status = 'publish'
");
Nhưng với Eloquent thì viết như sau:
$records = PostsModel::query()->where('post_status', 'publish')
->whereHas('author_meta', function ($query) {
$query->where('meta_key', 'role')->where('meta_value', 'editor');
})->get()->toArray();
Và trong PostsModel chúng ta viết một method Relationship như sau:
public function author_meta() {
return $this->hasMany(AuthorMetaModel::class, 'author_id', 'author_id');
}
Ngắn gọn, tường minh và có thể dễ dàng tái sử dụng.
Eloquent ORM cung cấp cho bạn một cách tiếp cận và làm việc với Database thú vị hơn, tường minh hơn và dễ dàng tái sử dụng. Code của bạn trông sẽ rõ ràng hơn!
Lấy thêm ví dụ như sau:
- Bạn truy cập vào trang chi tiết bài viết với URL là: https://domain.com/posts/1
- Tại trang này, bạn muốn lấy role của author và hiển thị ra ngoài.
Với Eloquent bạn viết rất đơn giản như sau:
# Cách 1:
$postId = ...;
$post = PostsModel::find($postId);
$authorRole = $post->author_meta()->where('meta_key', 'role')->first()->meta_value;
# Cách 2:
Sửa lại Relationship: author_meta trong PostsModel như sau:
public function author_meta($meta_key = null) {
$query = $this->hasMany(AuthorMetaModel::class, 'author_id', 'author_id');
if ($meta_key) {
$query->where('meta_key', $meta_key);
}
return $query;
}
Sau đó code lấy role của $post như sau:
$postId = ...;
$post = PostsModel::find($postId);
$authorRole = $post->author_meta('role')->first()->meta_value;
Nếu bạn muốn lấy ra tất cả author_meta của $post kia, bạn chỉ cần viết:
$post->author_meta->toArray();
Vậy còn, Thêm/Sửa/Xóa dữ liệu thì sao?
1. Thêm bài viết:
$posts = PostsModel::create([
'title' => 'My post title',
'post_status' => 'publish',
'author_id' => 1,
]);
2. Sửa bài viết:
$postId = ...;
$post = PostsModel::find($postId);
$post->update([
'title' => time(),
'post_status' => 'draft',
]);
3. Xóa bài viết:
$postId = ...;
$post = PostsModel::find($postId);
$post->delete(); // Xóa mềm
// $post->forceDelete(); // Xóa vĩnh viễn
That’s it! Very simple, very clean code, rights? 🙂
Như vậy, bài viết này đã mô tả khái quát về Eloquent ORM, cung cấp cho bạn một cái nhìn mới mẻ về vấn đề làm việc với Database. Chúc bạn thành công!