Mở rộng Query Builder cho Laravel

Mở rộng Query Builder cho Laravel

Phải thừa nhận với những phương thức rất hữu ích được cung cấp sẵn (như findOrFail() hay firstOrFail()…), khiến cho làm việc với Laravel rất sướng. Tuy nhiên, sẽ có lúc bạn nhận ra rằng bạn còn cần nhiều hơn thế. Và đó là lúc bạn cần tự tay mở rộng Query Builder cho Laravel để phù hợp hơn với nhu cầu của mình.

Hãy bắt đầu với một ví dụ đơn giản: bạn có một model News và một model Page, cả 2 model này đều sử dụng slug để tạo pretty URL. Và truy vấn của chúng ta sẽ có dạng như thế này:

News::where('slug', 'news-title')->firstOrFail();

Tuy nhiên, vẫn khá là dài dòng, và chúng ta muốn nó trở nên ngắn gọn, đẹp, và dễ hiểu hơn. Như này chẳng hạn:

News::findBySlugOrFail('news-title');

Để làm được như vậy, chúng ta cần mở rộng Query Builder cho Laravel và tạo một phương thức tùy chỉnh.

Đầu tiên, bạn cần tạo một class nằm trong thư mục app/Builder , chảng hạn app/Builder/SlugBuilder.php. Class này bắt buộc phải được extends từ Laravel Eloquent Builder.

<?php

namespace App\Builder;

use Illuminate\Database\Eloquent\Builder;

class SlugBuilder extends Builder
{
    //
}

Tiếp theo, chúng ta cần đảm bảo các Model sử dụng slug sẽ được extends từ SlugBuilder, thay vì Model như mặc định.

<?php

namespace App;

use App\Builder\SlugBuilder;

class News extends SlugBuilder
{
    // Your model methods & properties
}

Tất nhiên việc này hoàn toàn không làm ảnh hưởng đến hoạt động của Model, nó vẫn sẽ hoạt động bình thường như trước kia bởi SlugBuilder chính là được kế thừa từ Query Builder của Laravel.

Bây giờ, công việc còn lại chỉ là thêm các phương thức mà chúng ta muốn bổ sung cho Model của mình. Ví dụ ở đây là findBySlug():

<?php

namespace App\Builder;

use Illuminate\Database\Eloquent\Builder;

class SlugBuilder extends Builder
{
    public function findBySlug($slug, $columns = ['*'])
    {
        return $this->where('slug', $slug)->first($columns);
    }
}

Và Model của bạn sẽ được bổ sung thêm phương thức này:

News::findBySlug('news-slug');

Ví dụ thêm một phương thức nữa để trả về lỗi 404 nếu slug không tồn tại:

public function findBySlugOrFail($slug, $columns = ['*'])
{
    return $this->where('slug', $slug)->firstOrFail($columns);
}

Bạn thấy đấy. rất đơn giản phải không? Bằng cách mở rộng Query Builder cho Laravel, bạn sẽ có thể thêm bao nhiêu phương thức bạn muốn, miễn là nó phù hợp với dự án là ok.

Chúc bạn thành công!

Công ty TNHH Giải pháp Website & Ứng dụng phần mềm Quang Minh

🚩 Địa chỉ
Số 81 Võ Huy Tâm, Phường Cẩm Trung, Thành phố Cẩm Phả, Tỉnh Quảng Ninh
📞 Điện thoại
(0862) 814-787
💌 Email
[email protected]
🌐 Zalo OA
https://zalo.me/369605269295116980
🌐 Facebook
https://www.facebook.com/qmasdotvn/
🌐 Twitter