PHPackages                             anourvalar/eloquent-request - 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. anourvalar/eloquent-request

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

anourvalar/eloquent-request
===========================

Dynamic Query Builder based on request

2.10.14(1w ago)412.0k—3.6%[1 PRs](https://github.com/AnourValar/eloquent-request/pulls)1MITPHPPHP ^8.2CI failing

Since Sep 11Pushed 3w ago1 watchersCompare

[ Source](https://github.com/AnourValar/eloquent-request)[ Packagist](https://packagist.org/packages/anourvalar/eloquent-request)[ Docs](https://github.com/AnourValar/eloquent-request)[ RSS](/packages/anourvalar-eloquent-request/feed)WikiDiscussions master Synced 2d ago

READMEChangelog (10)Dependencies (31)Versions (120)Used By (1)

QueryBuilder from Request
=========================

[](#querybuilder-from-request)

- Filling up the QueryBuilder from user data. Key feature is safety: all data is under a validation.
- Profile-based approach limit access to the columns and operations.

Installation
------------

[](#installation)

```
composer require anourvalar/eloquent-request
```

Usage: basic
------------

[](#usage-basic)

**Request**

```
{
  "filter": {
    "created_at": {">": "2021-01-01"}
  },
  "sort": {
    "created_at": "DESC"
  }
}
```

**Code**

```
class UserController extends Controller
{
    /**
     * Profile
     */
    protected $profile = [
        'filter' => [
            'created_at' => ['=', '!=', '', '>=', 'in', 'not-in'],
        ],

        'sort' => ['created_at'],
    ];

    /**
     * Users list
     */
    public function index(Request $request)
    {
        $users = \App::make(\AnourValar\EloquentRequest\Service::class)->buildBy(
            \App\User::class,
            $this->profile,
            $request->input()
        );

        // Equals to:
        // \App\User
        //     ::where('created_at', '>', '2021-01-01')
        //     ->orderBy('created_at', 'DESC')
        //     ->paginate($request->input('page'));
    }
}
```

Usage: relations &amp; QueryBuilder preconfigure
------------------------------------------------

[](#usage-relations--querybuilder-preconfigure)

**Request**

```
{
  "filter": {
    "userPhones.phone_number": {"like": "1234"}
  }
}
```

**Code**

```
class UserController extends Controller
{
    /**
     * Profile
     */
    protected $profile = [
        'filter' => [
            'userPhones.phone_number' => ['like'],
        ],
    ];

    /**
     * Users list
     */
    public function index(Request $request)
    {
        $users = \App::make(\AnourValar\EloquentRequest\Service::class)->buildBy(
            \App\User::where('status', '=', 'active'), $this->profile, $request->input()
        );

        // Equals to:
        // \App\User
        //    ::where('status', '=', 'active')
        //    ->whereHas('userPhones', function ($query)
        //    {
        //        $query->where('phone_number', 'like', '%1234%');
        //    })
        //    ->paginate($request->input('page'));
    }
}
```

Usage: simple pagination
------------------------

[](#usage-simple-pagination)

**Code**

```
class UserController extends Controller
{
    /**
     * Profile
     */
    protected $profile = [
        'options' => [
            \AnourValar\EloquentRequest\Actions\PaginateAction::OPTION_SIMPLE_PAGINATE,
            \AnourValar\EloquentRequest\Actions\PaginateAction::OPTION_PAGE_MAX => 20,
        ],
    ];

    /**
     * Users list
     */
    public function indexAny()
    {
        $list = $this->buildBy(
            \App\User::whereNotNull('email_verified_at')
        );

        // Equals to: \App\User::whereNotNull('email_verified_at')->simplePaginate($request->input('page'));
    }
}
```

Usage: advanced features
------------------------

[](#usage-advanced-features)

**Code**

```
class UserController extends Controller
{
    use \AnourValar\EloquentRequest\ControllerTrait; // helper for quick usage

    /**
     * Profile
     */
    protected $profile = [
        'filter' => [
            'created_at' => \AnourValar\EloquentRequest\Events\RequestBuiltEvent::PROFILE_FILTER_DATE, // preset
        ],

        'ranges' => [
            'created_at' => ['min' => '2018-01-01'], // filter's constrainment
        ],

        'scope' => [
            'customStuff', // Eloquent scope
        ],

        'sort' => ['created_at'],
    ];

    /**
     * Users list
     */
    public function indexAny()
    {
        $users = $this->buildBy(\App\User::where('status', '=', 'active'));
    }
}
```

Usage: via facade
-----------------

[](#usage-via-facade)

**Code**

```
$profile = [
    'filter' => [
        'id' => ['in'],
    ],
];

$request = [
    'filter' => ['id' => ['in' => [1,2,3]]],
];

$collection = \EloquentRequest::buildBy(\App\User::class, $profile, $request);
```

Usage: Flat table
-----------------

[](#usage-flat-table)

### Setup

[](#setup)

Model Observer (saved, deleted):

```
\EloquentRequestFlat::sync(\App::make(\App\Drivers\ModelFlat::class), $model);
```

Migration (up):

```
\EloquentRequestFlat::createTable(\App::make(\App\Drivers\ModelFlat::class));
```

Migration (down):

```
\EloquentRequestFlat::dropTable(\App::make(\App\Drivers\ModelFlat::class));
```

### "Simple" workflow

[](#simple-workflow)

Config:

```
'flat' => [
    'shadow' => false,
],
```

Seeder:

```
if (! \EloquentRequestFlat::isActualTable($flatInterface)) {
    \EloquentRequestFlat::createTable($flatInterface);
    \EloquentRequestFlat::resync($flatInterface, \App\Model::class);
}
```

### "Shadow" workflow

[](#shadow-workflow)

Config:

```
'flat' => [
    'shadow' => true, // it's recommended to false when the structure is permanent
],
```

Seeder:

```
if (! \EloquentRequestFlat::isActualTable($flatInterface)) {
    \EloquentRequestFlat::createTable($flatInterface);
}
```

After deploy:

```
if (\EloquentRequestFlat::shadow($flatInterface)) {
    $closure = function ($flatInterface, $model) {
        \DB::transaction(function () use ($flatInterface, $model) {
            // Atomic lock (for sync):
            //
            $this->syncSoft($flatInterface, $model->fresh());
        });
    };
    \EloquentRequestFlat::resync($flatInterface, \App\Model::class, $closure);

    \DB::transaction(function () use ($flatInterface) {
        // Atomic lock (for sync):
        //
        \EloquentRequestFlat::switchShadow($flatInterface);
    });
}
```

###  Health Score

61

—

FairBetter than 98% of packages

Maintenance96

Actively maintained with recent releases

Popularity28

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity88

Battle-tested with a long release history

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~21 days

Recently: every ~12 days

Total

118

Last Release

12d ago

Major Versions

0.3.0 → 1.0.02020-03-24

1.21.3 → 2.0.02022-11-02

PHP version history (6 changes)0.2.0PHP &gt;=7.0.0

1.11.2PHP &gt;=7.1.0

1.17.4PHP &gt;=8.0.0

1.19.0PHP &gt;=8.0

1.21.3PHP ^8.0

2.5.0PHP ^8.2

### Community

Maintainers

![](https://www.gravatar.com/avatar/db1765d50b04dca380c835746bee50f75be1683fd930f276def046cef17f5d2c?d=identicon)[AnourValar](/maintainers/AnourValar)

---

Top Contributors

[![AnourValar](https://avatars.githubusercontent.com/u/54237693?v=4)](https://github.com/AnourValar "AnourValar (127 commits)")

---

Tags

requestlaravelmodeleloquentquerybuilderquerybuilderanourvalarfilterdynamic

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/anourvalar-eloquent-request/health.svg)

```
[![Health](https://phpackages.com/badges/anourvalar-eloquent-request/health.svg)](https://phpackages.com/packages/anourvalar-eloquent-request)
```

###  Alternatives

[anourvalar/eloquent-serialize

Laravel Query Builder (Eloquent) serialization

11223.5M33](/packages/anourvalar-eloquent-serialize)[tucker-eric/eloquentfilter

An Eloquent way to filter Eloquent Models

1.8k5.1M34](/packages/tucker-eric-eloquentfilter)[jedrzej/searchable

Searchable trait for Laravel's Eloquent models - filter your models using request parameters

127270.5k5](/packages/jedrzej-searchable)[jedrzej/pimpable

Laravel 4/5/6 package that allows to dynamically filter, sort and eager load relations for your models using request parameters

105188.2k1](/packages/jedrzej-pimpable)[elipzis/laravel-cacheable-model

Automatic query-based model cache for your Laravel app

15853.1k](/packages/elipzis-laravel-cacheable-model)[omalizadeh/laravel-query-filter

A laravel package for resource filtering via request query string

153.0k](/packages/omalizadeh-laravel-query-filter)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
