
Eloquent Query Scopes là một tính năng mạnh mẽ trong Laravel, giúp bạn tái sử dụng các đoạn mã truy vấn một cách dễ dàng. Bằng cách định nghĩa các scope, bạn có thể gom nhóm các truy vấn phức tạp thành các phương thức có thể tái sử dụng trên nhiều nơi trong ứng dụng.
Tổng quan
1. Local Scopes (Phạm vi cục bộ)
Local scopes cho phép bạn định nghĩa một truy vấn cụ thể ngay trong model và có thể được gọi trực tiếp từ các truy vấn Eloquent. Một scope cục bộ được định nghĩa bằng cách tạo một phương thức trong model và bắt đầu tên phương thức bằng từ khoá scope
.
Ví dụ:
Giả sử bạn có một model User
và bạn muốn tạo một scope để lấy tất cả các người dùng đã kích hoạt:
class User extends Model
{
public function scopeActive($query)
{
return $query->where('active', 1);
}
}
Bạn có thể sử dụng scope này trong các truy vấn của mình như sau:
$activeUsers = User::active()->get();
Phương thức scopeActive
sẽ được gọi một cách tự động khi bạn sử dụng active()
trong truy vấn. Scope này giúp mã trở nên ngắn gọn, dễ đọc và có thể tái sử dụng nhiều lần.
2. Dynamic Scopes (Phạm vi động)
Dynamic scopes cho phép bạn truyền tham số vào các phương thức scope để tuỳ chỉnh truy vấn dựa trên tham số đó.
Ví dụ:
Nếu bạn muốn tạo một scope để lấy người dùng dựa trên độ tuổi:
class User extends Model
{
public function scopeOfAge($query, $age)
{
return $query->where('age', $age);
}
}
Bạn có thể sử dụng scope này như sau:
$users = User::ofAge(25)->get();
Scope ofAge
sẽ nhận một tham số $age
và trả về danh sách người dùng có độ tuổi tương ứng.
3. Global Scopes (Phạm vi toàn cục)
Global scopes được áp dụng tự động trên mọi truy vấn của một model. Chúng thường được sử dụng khi bạn muốn áp dụng một điều kiện chung cho tất cả các truy vấn liên quan đến model đó. Để tạo một global scope, bạn cần định nghĩa một class riêng biệt và implement interface Scope
.
Ví dụ:
Giả sử bạn muốn áp dụng một scope để chỉ lấy những người dùng đã kích hoạt trong tất cả các truy vấn liên quan đến model User
:
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class ActiveScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
return $builder->where('active', 1);
}
}
Sau đó, bạn thêm scope này vào trong model User
:
class User extends Model
{
protected static function booted()
{
static::addGlobalScope(new ActiveScope);
}
}
Bây giờ, mọi truy vấn liên quan đến model User
sẽ tự động thêm điều kiện where('active', 1)
.
4. Xoá Global Scopes
Nếu bạn muốn loại bỏ một global scope khỏi một truy vấn cụ thể, bạn có thể sử dụng phương thức withoutGlobalScope
.
Ví dụ:
$users = User::withoutGlobalScope(ActiveScope::class)->get();
Lệnh này sẽ loại bỏ scope ActiveScope
và trả về tất cả người dùng, kể cả những người dùng chưa kích hoạt.
Lợi ích của Eloquent Query Scopes
- Tái sử dụng: Các scope giúp bạn tránh lặp lại mã bằng cách gom nhóm các điều kiện truy vấn chung vào một nơi có thể tái sử dụng.
- Tăng tính rõ ràng: Sử dụng scopes giúp mã nguồn dễ đọc hơn và rõ ràng hơn, đặc biệt là khi truy vấn phức tạp.
- Dễ bảo trì: Khi cần thay đổi một điều kiện truy vấn, bạn chỉ cần thay đổi trong scope và tất cả các truy vấn khác sẽ tự động cập nhật theo.
Kết luận
Eloquent Query Scopes là một công cụ tuyệt vời giúp bạn tối ưu hoá và tổ chức mã nguồn của mình. Bằng cách sử dụng Local Scopes, Dynamic Scopes và Global Scopes, bạn có thể dễ dàng tái sử dụng các truy vấn phức tạp và giữ cho mã nguồn của mình ngắn gọn, dễ bảo trì.
Danh mục
Bài viết liên quan

Quản Lý Thời Gian Tự Động Trong Eloquent
Author: | ADMIN |
---|

Các Mối Quan Hệ Trong Eloquent
Author: | ADMIN |
---|

Basic Eloquent Model and MVC
Author: | ADMIN |
---|

Eager Loading
Author: | ADMIN |
---|
Bài viết khác

Blade Basics
Author: | ADMIN |
---|

9 Mẹo Hữu Ích Khi Sử Dụng Blade Trong Laravel
Author: | ADMIN |
---|

Hiển thị giá trị trong Blade
Author: | ADMIN |
---|