Anh em Dev khi làm việc với laravel thì chắc chắn không còn quá xa lạ gì với model. Nhưng mọi người đã bao giờ đi sâu vào tìm hiểu về Model hay sử dụng như nào cho hiệu quả không?
Trong bài viết này mình sẽ chia sẻ các bí kíp và kỹ năng xử lý với model mà mình đã biết. Hy vọng sẽ giúp ích cho anh em.
1. toBase()
$orders = Order::get();
// toBase()
$orders = Order::toBase()->get();
Nếu như anh em để ý thì khi query với method get() thông thường thì mô hình model sẽ phải gọi lại liên tục bằng với số bản ghi mà anh em query ra.
Nhưng khi sử dụng toBase()->get() thì việc query sẽ không phải tại lại mô hình model. Sẽ giúp anh em tối ưu được rất nhiều thời gian và ram khi xử lý.
2. cursor()
$orders = Order::toBase()->cursor();
Với cursor thì mô hình model sẽ không được tải trước
Chúng ta phải dùng foreach hoặc map để duyệt qua từng phần từ. Câu lệnh phù hợp việc xử lý số lượng bản ghi lớn và phải xử lý từng phần tử. Việc không load toàn bộ dữ liệu mà chỉ load từng dữ liệu ra làm việc giúp việc xử lý số lượng bản ghi lớn thật nhẹ nhàng.
3. Chunk()
Rất nhiều dev đang get all dữ liệu dùng laravel collection để chunk hoặc array_chunk để chia nhỏ dữ liệu ra xử lý. Nhưng với model của laravel anh em hoàn toàn có thể làm việc này nhanh gọn hơn rất nhiều. Model cũng sẽ lấy đủ số lượng bản ghi mỗi lần chunk chứ sẽ không load toàn bộ dữ liệu
Order::chunk(100, function ($users) {
foreach ($users as $user) {
// ...
}
});
3. orderBy()
Với order by khi được yêu cầu sắp xếp các bản ghi từ mới tới cũ tôi thấy anh em hay sử dụng:
$orders = Order::orderByDesc('created_at')->get();
Câu lệnh vẫn đúng với yêu cầu nhưng chẳng tối ưu chút nào. Thông thường bất kỳ cơ sở dữ liệu nào cũng sẽ có id là khóa chính và được đánh index, mà id thường sử dụng increment theo từng bản ghi mới. Nhưng vậy ta sử dụng order by với id vẫn đúng yêu cầu mà câu lệnh của chúng ta tối ưu hơn rất nhiều.
$orders = Order::orderByDesc('id')->get();
4. X or Y method
- firstOrFail
- findOrFail
- firstOrCreate
- firstOrNew
- findOrNew
5. Model boot() method
Boot model được ứng dụng cực kỳ mạnh mẽ cho việc kiểm soát các tương tác với model. Thiết lập các sự kiện event(), global scope, thiết lập model khi khởi tạo.
Thiết lập events
protected static function boot()
{
self::created(function (CostCenterMasterModel $costCenterMasterModel) use ($screen, $userUpdate) {
$field = [
"Adv" => $costCenterMasterModel->advertiser_id,
"Publisher" => $costCenterMasterModel->publisher_id,
"Cost center master" => $costCenterMasterModel->cost_center_id,
"Apply date" => $costCenterMasterModel->start_date,
"End date" => $costCenterMasterModel->end_date,
];
event(new SystemLogEvent($screen, $userUpdate, 'Create/Import cost center master', null, $field));
});
}
Định nghĩa global scopes
protected static function boot()
{
parent::boot();
static::addGlobalScope('active', function (Builder $builder) {
$builder->where('status', '=', 'active');
});
}
Thiết lập ban đầu khác
protected static function boot()
{
parent::boot();
// Thiết lập giá trị mặc định cho một thuộc tính
static::creating(function ($model) {
$model->attribute = $model->attribute ?? 'default_value';
});
}