PHPackages                             papalapa/laravel-query-filter - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. papalapa/laravel-query-filter

ActiveLibrary[Database &amp; ORM](/categories/database)

papalapa/laravel-query-filter
=============================

API Query Filter for data providers (Eloquent models)

1.2.5(1y ago)1744MITPHPPHP ^8.0

Since Aug 8Pushed 1y ago1 watchersCompare

[ Source](https://github.com/papalapa/laravel-query-filter)[ Packagist](https://packagist.org/packages/papalapa/laravel-query-filter)[ RSS](/packages/papalapa-laravel-query-filter/feed)WikiDiscussions main Synced 3w ago

READMEChangelog (10)Dependencies (3)Versions (16)Used By (0)

### QueryFilter based on "Laravel Query Builder"

[](#queryfilter-based-on-laravel-query-builder)

What if we need to build a query string in "safe" mode? 🤔

Or do we have multiple routes to get the sibling lists of models? 🙇

For example:

```
/**
 * @property $id int
 * @property $firstname string
 * @property $lastname string
 * @property $role string|null
 * @property $created_at Carbon
 */
class User {}

// ...

Route::get('/users', [UserController::class, 'users']);
Route::get('/users/superusers', [UserController::class, 'superusers']);
Route::get('/users/all', [UserController::class, 'all']);

// ...

class UserController {
    public function users() {
        return User::query()->whereNull('role')->get();
    }

    public function superusers() {
        return User::query()->whereNotNull('role')->get();
    }

    public function all() {
        return User::query()->orderBy('username')->get();
    }
}
```

Instead of this we can build query through query params! 🙋

Also, we can change pagination page and limit, query sort direction or use filter conditions. 🧐

Let's create DataProvider for model User:

```
use Papalapa\Laravel\QueryFilter\BaseDataProvider;

final class UserDataProvider extends BaseDataProvider
{
    /**
     * Default sorting columns, when other not set
     */
    protected array $defaultSort = [
        'id' => 'asc',
    ];

    /**
     * Final sorting columns, which use always
     */
    protected array $finalSort = [
        'created_at' => 'desc',
    ];

    /**
     * Safe-attributes to use in filtration
     */
    protected array $allowedFilter = [
        'name' => ['lastname', 'firstname'], // alias of two columns
        'role',
    ];

    /**
     *  Safe-attributes to use in sorting
     */
    protected array $allowedSort = [
        'name' => ['lastname', 'firstname'], // alias of two columns
        'datetime' => 'created_at',
    ];

    protected function makeBuilder() : EloquentBuilder
    {
        return User::query()
            ->select([
                'id',
                'lastname',
                'firstname',
                'role',
            ]);
    }
}
```

Ok, now we are ready to refactor our routes and controller:

```
Route::get('/users', [UserController::class, 'users']);

class UserController {
    public function users(UserDataProvider $dataProvider) {
        return $dataProvider->paginate();
    }
}
```

That is all! 💥 But how it works? ❓

Our new request must contain special query attributes to control query building: ⚡

```
https://domain.local/users
    ?_filter={"name": "^John", "or": [ {"role": "admin"}, {"role": "manager"} ], "and": [ {"datetime": ">=2021-01-01"}, {"datetime": "
