Khi làm việc với bất kỳ ngôn ngữ lập trình hoặc framework nào, các bạn có thể sử dụng một số mẹo và thủ thuật để nâng cao trình độ code của mình và làm cho ứng dụng của bạn hoạt động hiệu quả hơn và code đẹp hơn. Trong bài viết này, mình sẽ giới thiệu cho bạn một số mẹo và hy vọng bạn có thể sử dụng chúng để tăng tốc các ứng dụng Laravel của mình.
1. Sử Dụng Laravel Query Scope
Thông thường, khi sử dụng Eloquent ORM trong Laravel, chúng ta thường cần có những điều kiện để lấy dữ liệu giống như dưới:
$active_administrators = User::where('active', '=', 1)->where('is_admin', '=', 1)->get();
Các điều kiện này có thể được sử dụng ở những nơi khác trong ứng dụng. Do đó để code dễ đọc và tránh lặp code, chúng ta có thể sử dụng Query Scope. Chúng ta sẽ tạo query scope trong model User như dưới:
public function scopeActive($query) { return $query->where('active', '=', 1); } public function scopeAdmin($query) { return $query->where('is_admin', '=', 1); }
Bây giờ câu query của chúng ta sẽ ngắn gọn như vậy:
$active_administrators = User::active()->admin()->get();
2. Đặt Giá Trị Mặc Định Cho Column Khi Khởi Tạo Model
Trong một vài trường hợp chúng ta muốn đặt một giá trị mặc định cho column khi tạo một record mới. Các bạn có thể sử dụng Model Creating Event bên trong hàm boot của model. Ví dụ bên dưới mình sẽ đặt giá trị column paid = 0 mỗi khi model Invoice tạo mới một record:
class Invoice extends Model { protected static function boot() { parent::boot(); Invoice::creating(function($model) { $model->paid = 0; }); } }
3. Tránh Lỗi Code Bằng Cách Sử Dụng Optional Helper
Khi truy xuất giá trị từ một Object, nếu Object đó null, code của bạn sẽ báo lỗi:
return $invoice->total;
Nếu như $invoice rỗng thì sẽ báo lỗi. Cách đơn giản để tránh lỗi đó là sử dụng optional helper của Laravel:
return optional($invoice)->total;
Bây giờ nếu $invoice object = null, code của bạn sẽ trả về null thay vì báo lỗi. Các bạn cũng có thể sử dụng Closure với optional helper. Nó sẽ nhận Closure là tham số thứ 2 nếu như tham số được gọi không null:
return optional(Invoice::find($id), function ($invoice) { return $invoice->total; });
4. Tự Động Xóa Các Record Relationship
Trong khi thiết kế database, việc tạo các bảng liên quan thường phải có. Khi xóa các record parent thì các record con cũng nên được xóa theo. Để làm việc này, chúng ta có thể sử dụng Model Deleting Event bên trong phương thức boot(). Ví dụ, xóa tất cả các items của invoice:
class Invoice extends Model { public function items() { return $this->hasMany('\App\Models\Item'); } public static function boot() { parent::boot(); static::deleting(function($invoice) { foreach ($invoice->items as $item) { $item->delete(); } }); } }
5. Cập Nhật Hoặc Tạo Mới
Trong khi làm việc với database, chúng ta thường kiểm tra xem record có tồn tại không rồi update, hoặc tạo mới record:
$invoice = Invoice::where('active', 1) ->where('client', 'My client') ->where('price', 49) ->first(); if ($invoice) { $invoice->update(['price' => 29]); }
Các bạn có thể sử dụng phương thức updateOrCreate để thay thế:
$invoice = Invoice::updateOrCreate( ['active' => '1', 'client' => 'My client'], ['price' => 29] );
6. Sử Dụng Laravel Collection
Collections là một tính năng lớn của Laravel cho phép chúng ta thao tác với các kiểu dữ liệu mảng. Nó là một công cụ giúp chúng ta tiết kiệm thời gian và sử dụng cú pháp đơn giản và trực quan, đặc biệt hữu ích khi kết hợp với Eloquent. Ví dụ, nếu bạn có truy vấn như sau:
$invoices = Invoice::where('active', 1) ->orderBy('total') ->take(10) ->get()
Nếu muốn xóa các invoice đã được thanh toán, chúng ta có thể sử dụng collection reject method:
$activeInvoices = $invoices->reject(function ($invoice) { return $invoice->paid; });
Chúng ta có thể sử dụng filter:
$activeInvoices = $invoices->filter(function ($invoice) { return $invoice->paid; });
Lấy item đầu tiên của Collection phù hợp với điều kiện:
$activeInvoices = $invoices->first(function ($invoice) { return $invoice->paid; });
Tổng Kết:
Một vài mẹo giúp cải thiện code, dễ đọc hơn trong quá trình phát triển ứng dụng. Nếu có góp ý gì vui lòng để lại comment bên dưới. Cám ơn!