Sort và filter dữ liệu dễ dàng hơn với Laravel Purity

Giới thiệu về Laravel Purity

Laravel purity là một thư viện hỗ trợ filter và sort data một cách dễ dàng đơn giản hỗ trợ trực tiếp cho laravel framework. Để biết được sự lợi hại của thư viện này. Hãy cùng mình mò mẫm nó nhé. Let’s gooooooo !!!

Đặt vấn đề

Khi chúng ta viết api để filter nhiều giá trị cùng một lúc thì service của chúng ta sẽ khá dài dòng và rườm rà. Để viết ra một hàm filter dùng chung thì sẽ tốn khá nhiều thời gian và chất xám. Vì vậy thư viện này sinh ra với mục đích tối giản hơn về cách filter và sort dữ liệu.

Lợi ích khi sử dụng

Khi chúng ta viết một cách bình thường:

PHP
public function index(Request $request)
{
    $query = Post::query();

    // Lọc theo tiêu đề
    if ($request->has('title')) {
        $query->where('title', 'like', '%' . $request->input('title') . '%');
    }

    // Lọc theo nội dung (content)
    if ($request->has('content')) {
        $query->where('content', 'like', '%' . $request->input('content') . '%');
    }

    // Lọc theo ngày xuất bản (published_at)
    if ($request->has('published_at')) {
        $query->whereDate('published_at', '=', $request->input('published_at'));
    }

    $posts = $query->get();

    return response()->json($posts);
}

Khi dùng thư viện trên

PHP
public function index(Request $request)
{
    $query = Post::filter()->get();

    return response()->json($posts);
}

Thật là ngắn gọn và súc tích phải không nào !!!

Cách cài đặt và sử dụng

Mở terminal của project lên và cài bằng composer nhé:

composer require abbasudo/laravel-purity 
php artisan vendor:publish --tag=purity 

Lệnh này để publish thư mục `config/purity` cho phép chúng ta có thể custom được filter mà chúng ta muốn.

Vậy là thư viện đã sẵn sàng để sử dụng. Tiếp theo hãy tìm tới Model mà bạn muốn filter nhé. Ở đây mình đang filter cho Model Post

PHP
<?php

namespace App\Models;

use Abbasudo\Purity\Traits\Filterable;
use Abbasudo\Purity\Traits\Sortable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;
    use Filterable;
    use Sortable;

    protected $filterFields = [
        'id',
        'title',
        'content',
        'published_at',
        'category_id',
        'category'
    ];

    public function category()
    {
        return $this->belongsTo(Category::class);
    }
}

Các bạn chỉ cần Use Filterable và Sortable của thư viện để sử dụng. Mảng $filterFields là những giá trị mình muốn filter nhé. Ở đây mình có Category là relation của Post.

Tiếp theo trong function của mình dùng câu lệnh này nữa là oke nhoé :))

return Post::sort()->filter()->with('category')->get();

Đây là một url để chúng ta filters nhé

GET /api/posts?filters[field][operator]=value

Dưới đây là một số operator mà thư viện hỗ trợ

Test kết quả

Dưới đây là video mình test bằng Postman. Các bạn có thể test thử xem nhé!

Tổng kết

Đây là một thư viện khá hay mà mình vô tình đọc được. Ở trên mình tập trung nhiều cho phần filter, còn sort cũng khá hay, các bạn khám phá thử xem nhá.

Hy vọng các bạn cảm thấy nó thú vị và có thể áp dụng vào dự án nếu có những tính năng tương tự. Cảm ơn mọi người đã dành thời gian đọc ạ ☺️☺️☺️

Nguồn:

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like
Read More

20 Laravel Eloquent Tips and Tricks (P1)

Eloquent ORM được sủ dụng rất nhiều trong 1 project Laravel, tuy nhiên để sử dụng được tối đa những gì Laravel cung cấp thì không phải ai cũng biết. Trong bài viết này mình sẽ chỉ cho các bạn một vài thủ thuật, hi vọng sẽ giúp ích cho các bạn trong một vài trường hợp cụ thể.
Read More

Có gì mới ở PHP 8.3?

Table of Contents Hide 1. Typed Class Constants2. Dynamic class constant fetch3. json_validate() function4. #[\Override] attribute5. Deep Cloning of readonly Properties6. Randomizer::getBytesFromString() method7. Randomizer::getFloat() and…
Read More

SOLID Principles

Table of Contents Hide Single-responsibility PrincipleOpen/Closed Principle (OCP)Liskov Substitution Principle (LSP)Interface Segregation Principle (ISP)Dependency Inversion Principle (DIP)Advantages of…