PHPackages                             yassinedabbous/laravel-dynamic-fields - 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. yassinedabbous/laravel-dynamic-fields

Abandoned → [yassinedabbous/laravel-dynamic-query](/?search=yassinedabbous%2Flaravel-dynamic-query)Library

yassinedabbous/laravel-dynamic-fields
=====================================

Build query dynamicaly with your API

v2.0.0(1y ago)17MITPHPPHP &gt;=7.4CI failing

Since Jun 9Pushed 2mo ago2 watchersCompare

[ Source](https://github.com/YassineDabbous/laravel-dynamic-query)[ Packagist](https://packagist.org/packages/yassinedabbous/laravel-dynamic-fields)[ Docs](https://github.com/YassineDabbous/laravel-dynamic-query)[ RSS](/packages/yassinedabbous-laravel-dynamic-fields/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (2)Versions (6)Used By (0)

Laravel Dynamic Query
=====================

[](#laravel-dynamic-query)

[![Latest Version](https://camo.githubusercontent.com/3962483fcc1ba63becc1bb923c56f108f464b7b9c89513df241ded47ffb893f4/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f79617373696e65646162626f75732f6c61726176656c2d64796e616d69632d71756572792e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/yassinedabbous/laravel-dynamic-query)[![License](https://camo.githubusercontent.com/c1557e20ac07193b15831bccc0befabc5d39164e907123c9b96085947e9f95cb/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f79617373696e65646162626f75732f6c61726176656c2d64796e616d69632d71756572792e7376673f7374796c653d666c61742d737175617265)](LICENSE)

**Build powerful, dynamic API queries from URL parameters.**
Let your API consumers select fields, filter, sort, group, paginate, and compute statistics — all from a single query string.

---

Table of Contents
-----------------

[](#table-of-contents)

- [Features](#features)
- [Requirements](#requirements)
- [Installation](#installation)
- [Quick Start](#quick-start)
- [Usage Overview](#usage-overview)
    - [Dynamic Fields](#dynamic-fields)
    - [Dynamic Filtering](#dynamic-filtering)
    - [Dynamic Sorting](#dynamic-sorting)
    - [Dynamic Grouping](#dynamic-grouping)
    - [Dynamic Statistics](#dynamic-statistics)
    - [Dynamic Pagination](#dynamic-pagination)
- [All-in-One Scopes](#all-in-one-scopes)
- [Configuration](#configuration)
- [Detailed Documentation](#detailed-documentation)
- [Security](#security)
- [Testing](#testing)
- [License](#license)

---

Features
--------

[](#features)

FeatureDescription**Field Selection**Clients choose which columns, relations, and appends to include in the response**Filtering**30+ operators including `like`, `between`, `in`, `null`, JSON operators, full-text search, and relation existence checks**Sorting**Multi-column sorting with ascending/descending via `-` prefix**Grouping**Group by columns or date macros (`year`, `month`, `day`, `hour`) with timezone support**Statistics**Aggregate metrics (`count`, `sum`, `avg`, `min`, `max`), custom SQL metrics, cumulative/growth transforms, and period-over-period comparison**Pagination**Configurable `paginate` / `simplePaginate` / `get all` with per-page limits**Smart Joins**Automatic `JOIN` generation from dot-notation (`user.email`) on filters, sorts, and groups**Date Presets**Semantic date ranges like `today`, `this_week`, `last_30_days`, `ytd`**Auto Relations**Discover model relations via PHP Reflection — zero configuration**Security**Strict whitelist-based filtering, SQL alias sanitization, and configurable defaults---

Requirements
------------

[](#requirements)

- PHP &gt;= 8.0
- Laravel 8.x / 9.x / 10.x / 11.x

---

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

[](#installation)

```
composer require yassinedabbous/laravel-dynamic-query
```

Publish the configuration file (optional):

```
php artisan vendor:publish --tag=dynamic-query-config
```

> The service provider is auto-discovered by Laravel.

---

Quick Start
-----------

[](#quick-start)

### 1. Add the trait to your model

[](#1-add-the-trait-to-your-model)

```
use YassineDabbous\DynamicQuery\HasDynamicQuery;

class Product extends Model
{
    use HasDynamicQuery;

    public function dynamicColumns(): array
    {
        return ['id', 'name', 'price', 'category_id', 'created_at'];
    }

    public function dynamicFilters(): array
    {
        return [
            'name'        => ['=', 'like%'],
            'price'       => ['=', '>', '=', ' 'category_id',       // depends on category_id column
        'reviews'  => null,                 // no column dependency
    ];
}

public function dynamicAppends(): array {
    return [
        'full_name'   => ['first_name', 'last_name'],  // depends on columns
        'status_label' => 'status',                     // depends on status column
    ];
}

public function dynamicAggregates(): array {
    return [
        'reviews_count' => fn($q) => $q->withCount('reviews'),
    ];
}
```

📖 [**Full Fields Documentation →**](docs/fields.md)

---

### Dynamic Filtering

[](#dynamic-filtering)

Filter with any of 30+ operators:

```
GET /api/products?price=>=100&name=Widget&_operators[name]=like%

```

Negate with `!` prefix:

```
GET /api/products?!category_id=5          # category_id != 5
GET /api/products?status=active&_logic=or  # OR logic across filters

```

Supports: `=`, `!=`, ``, `=`, `like`, `%like%`, `in`, `between`, `null`, `has`, `full_text`, `json_contains`, `json_overlaps`, and more.

📖 [**Full Filtering Documentation →**](docs/filtering.md)

---

### Dynamic Sorting

[](#dynamic-sorting)

Sort by one or more columns. Prefix with `-` for descending:

```
GET /api/products?_sort=price            # ASC
GET /api/products?_sort=-price,name      # price DESC, then name ASC
GET /api/products?_sort=user.name        # sort by related column (auto-join)

```

📖 [**Full Sorting Documentation →**](docs/sorting.md)

---

### Dynamic Grouping

[](#dynamic-grouping)

Group results with optional date macros:

```
GET /api/products?_group=category_id
GET /api/orders?_group=created_at:month&_timezone=America/New_York
GET /api/orders?_group=created_at:year,status

```

Supported macros: `year`, `month`, `day`, `hour`.

📖 [**Full Grouping Documentation →**](docs/grouping.md)

---

### Dynamic Statistics

[](#dynamic-statistics)

Compute metrics with grouping, transforms, comparisons, and caching:

```
GET /api/orders?_metric=sum:total&_group=created_at:month
GET /api/orders?_metric=avg:total&_transform=growth
GET /api/orders?_metric=count&_compare=previous_period&created_at[]=2024-01-01&created_at[]=2024-03-31

```

📖 [**Full Statistics Documentation →**](docs/statistics.md)

---

### Dynamic Pagination

[](#dynamic-pagination)

```
GET /api/products?per_page=25            # 25 items per page
GET /api/products?_get_all=true          # return all (if enabled)
GET /api/products?_simple=true           # use simplePaginate

```

📖 [**Full Pagination Documentation →**](docs/pagination.md)

---

All-in-One Scopes
-----------------

[](#all-in-one-scopes)

ScopeDescription`dynamicQuery()`Applies Select + Filter + Sort + Group`dynamicAPI()`Applies Select + Filter + Sort + Group + Paginate + Append```
// In a controller:
return Product::dynamicAPI();

// With explicit input (e.g. in a job or test):
return Product::dynamicAPI(['_fields' => 'id,name', '_sort' => '-price']);
```

---

Configuration
-------------

[](#configuration)

After publishing, edit `config/dynamic-query.php`:

```
return [
    'defaults' => [
        'per_page'      => 15,
        'max_per_page'  => 100,
        'allow_get_all' => false,
        'max_get_all'   => 1000,
        'cache_ttl'     => 600,
        'timezone'      => 'UTC',
    ],
    'settings' => [
        'enable_stats_cache' => false,
        'relation_guess'     => true,     // Auto-discover relations via Reflection
        'strict_filtering'   => true,     // Whitelist-only filtering
        'clean_response'     => true,     // Limit response to requested fields
    ],
    'params' => [
        'fields'  => '_fields',
        'sort'    => '_sort',
        'logic'   => '_logic',
        // ... and more
    ],
];
```

📖 [**Full Configuration Reference →**](docs/configuration.md)

---

Detailed Documentation
----------------------

[](#detailed-documentation)

DocumentTopics[Installation](docs/installation.md)Install, publish config, service provider[Configuration](docs/configuration.md)All config options, parameter names, defaults[Fields &amp; Selection](docs/fields.md)Columns, relations, appends, aggregates, deep fields, response cleaning[Filtering](docs/filtering.md)All operators, negation, OR logic, smart joins, named scopes, date presets, JSON operators[Sorting](docs/sorting.md)Multi-column, direction prefix, related-column sorting[Grouping](docs/grouping.md)Standard grouping, date macros, timezone, SQL generation[Statistics &amp; Metrics](docs/statistics.md)Aggregates, custom metrics, transforms, period comparison, caching, Stats API[Pagination](docs/pagination.md)Per-page, get-all, simple paginate, limits[Advanced](docs/advanced.md)Smart joins, auto-relation discovery, DynamicQueryable contract, morph model resolution, programmatic input---

Security
--------

[](#security)

This package follows a **whitelist-first** security approach:

- **Strict Filtering** — Only filters defined in `dynamicFilters()` are applied (enabled by default).
- **Column Whitelisting** — Only columns listed in `dynamicColumns()` can be selected.
- **SQL Sanitization** — All dynamically generated aliases are sanitized via regex.
- **Custom Metrics Safety** — `dynamicMetrics()` values are developer-defined SQL, never user input.
- **Pagination Limits** — `max_per_page` and `max_get_all` prevent resource exhaustion.

---

Testing
-------

[](#testing)

```
composer test
```

---

License
-------

[](#license)

The MIT License (MIT). See [LICENSE](LICENSE) for details.

###  Health Score

32

—

LowBetter than 72% of packages

Maintenance65

Regular maintenance activity

Popularity6

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity44

Maturing project, gaining track record

 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 ~29 days

Total

5

Last Release

585d ago

Major Versions

v1.1.0 → 2.x-dev2024-10-04

### Community

Maintainers

![](https://www.gravatar.com/avatar/1d37e45493d8bb1909560f0565f6ed570aff351ae461eacadb1024c0b231a917?d=identicon)[YassineDabbous](/maintainers/YassineDabbous)

---

Top Contributors

[![YassineDabbous](https://avatars.githubusercontent.com/u/10944169?v=4)](https://github.com/YassineDabbous "YassineDabbous (63 commits)")

---

Tags

laraveldynamic-fieldsselective columnsdynamic filterdynamic sort

### Embed Badge

![Health badge](/badges/yassinedabbous-laravel-dynamic-fields/health.svg)

```
[![Health](https://phpackages.com/badges/yassinedabbous-laravel-dynamic-fields/health.svg)](https://phpackages.com/packages/yassinedabbous-laravel-dynamic-fields)
```

###  Alternatives

[anourvalar/eloquent-serialize

Laravel Query Builder (Eloquent) serialization

11320.2M21](/packages/anourvalar-eloquent-serialize)[api-platform/laravel

API Platform support for Laravel

59126.4k6](/packages/api-platform-laravel)[codewithdennis/larament

Larament is a time-saving starter kit to quickly launch Laravel 13.x projects. It includes FilamentPHP 5.x pre-installed and configured, along with additional tools and features to streamline your development workflow.

3691.5k](/packages/codewithdennis-larament)

PHPackages © 2026

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