PHPackages                             solivellaluisalberto/laravelmakefiltersandsorts - 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. [Search &amp; Filtering](/categories/search)
4. /
5. solivellaluisalberto/laravelmakefiltersandsorts

ActiveLibrary[Search &amp; Filtering](/categories/search)

solivellaluisalberto/laravelmakefiltersandsorts
===============================================

Paquete Laravel para aplicar de manera eficiente filtros avanzados y ordenamientos dinámicos a consultas Eloquent a partir de parámetros de solicitudes HTTP.

v1.0.0(7mo ago)115MITPHPPHP ^8.1|^8.2|^8.3

Since Oct 1Pushed 7mo ago1 watchersCompare

[ Source](https://github.com/solivellaluisalberto/laravel-make-filters-and-sorts)[ Packagist](https://packagist.org/packages/solivellaluisalberto/laravelmakefiltersandsorts)[ RSS](/packages/solivellaluisalberto-laravelmakefiltersandsorts/feed)WikiDiscussions main Synced 1mo ago

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

🔍 Laravel Make Filters And Sorts
================================

[](#-laravel-make-filters-and-sorts)

[![PHP Version](https://camo.githubusercontent.com/5a175a1393dd15a80e976972d2063cff6f74f3bfb2c50aeed76c291dc36ef7dd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e30253230253743253230382e31253230253743253230382e32253230253743253230382e332d626c7565)](https://www.php.net/)[![Laravel](https://camo.githubusercontent.com/0585b90c828f0e93bb56aee4613dd64c53e0edeec28da72ea8291411de3c17b3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d382e78253230253743253230392e7825323025374325323031302e7825323025374325323031312e7825323025374325323031322e782d726564)](https://laravel.com/)[![License](https://camo.githubusercontent.com/f8df3091bbe1149f398a5369b2c39e896766f9f6efba3477c63e9b4aa940ef14/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e)](LICENSE)[![Tests](https://camo.githubusercontent.com/d940ad7f0752e2cbe0d63c50dcebf329078807390051c41fe63258f1b5c4e182/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d70617373696e672d627269676874677265656e)](tests/)

**Laravel Make Filters And Sorts** es un paquete Laravel potente y flexible que simplifica la aplicación de **filtros avanzados** y **ordenamientos dinámicos** en consultas Eloquent, basándose en parámetros de solicitudes HTTP.

Ideal para construir APIs REST con filtrado y ordenamiento complejos sin escribir código repetitivo.

---

✨ Características
-----------------

[](#-características)

- 🎯 **Filtros dinámicos potentes**: Soporta múltiples operadores de comparación
- 🔍 **Búsqueda multicolumna**: Busca en varias columnas simultáneamente con `like`
- 📊 **Ordenamiento flexible**: Simple o con relaciones mediante JOINs automáticos
- 🚀 **Nombre de tabla dinámico**: Funciona con cualquier modelo automáticamente
- ⚡ **Alto rendimiento**: Genera consultas SQL optimizadas
- 🛡️ **Validaciones robustas**: Ignora parámetros malformados sin romper la aplicación
- 🔒 **Prevención de ambigüedad**: Evita errores SQL automáticamente en consultas con JOINs
- 🧪 **Totalmente testeado**: Incluye suite completa de tests con casos edge
- 📦 **Zero config**: Funciona inmediatamente después de la instalación
- 🔄 **Compatible con futuras versiones**: Diseñado para ser compatible con Laravel 8-12+

### Operadores soportados

[](#operadores-soportados)

TipoOperadoresDescripción**Comparación**`=`, `!=`, `>`, `=`, ` 💡 **Nota**: Este paquete usa características fundamentales de Laravel que son muy estables y ha sido diseñado para ser compatible con todas las versiones actuales y futuras de Laravel.

### Instalación vía Composer

[](#instalación-vía-composer)

```
composer require solivellaluisalberto/laravelmakefiltersandsorts
```

### Auto-Discovery

[](#auto-discovery)

El paquete utiliza **auto-discovery** de Laravel, por lo que el Service Provider se registrará automáticamente.

👉 **Registro manual** (solo si no usas auto-discovery)Si tu versión de Laravel no soporta auto-discovery, registra el Service Provider manualmente en `config/app.php`:

```
'providers' => [
    // ...
    SolivellaLuisAlberto\LaravelMakeFiltersAndSorts\MakeFiltersAndSortsServiceProvider::class,
],
```

---

🚀 Inicio Rápido
---------------

[](#-inicio-rápido)

```
use Illuminate\Http\Request;
use App\Models\User;
use SolivellaLuisAlberto\LaravelMakeFiltersAndSorts\FilterService;

class UserController extends Controller
{
    public function index(Request $request)
    {
        // Iniciar la consulta
        $query = User::query();

        // Aplicar filtros y ordenamientos dinámicamente
        $query = FilterService::makeFiltersAndSorts($request, $query);

        // Obtener resultados paginados
        return $query->paginate(15);
    }
}
```

### Ejemplo de solicitud con filtros:

[](#ejemplo-de-solicitud-con-filtros)

```
{
    "filters": [
        { "column": "name", "operator": "like", "value": "John" },
        { "column": "age", "operator": ">=", "value": 30 }
    ]
}
```

### Ejemplo de solicitud con ordenamientos:

[](#ejemplo-de-solicitud-con-ordenamientos)

```
{
    "sorts": [
        { "column": "created_at", "order": "desc" },
        { "order": "asc", "relationship": { "table": "users", "column": "email" } }
    ]
}
```

---

🛡️ Validaciones de Seguridad
----------------------------

[](#️-validaciones-de-seguridad)

El paquete incluye **validaciones robustas** que garantizan que la aplicación nunca se rompa, incluso con parámetros malformados:

### ✅ **Validaciones Automáticas:**

[](#-validaciones-automáticas)

- **Parámetros principales**: Si `filters` o `sorts` no son arrays, se convierten automáticamente a arrays vacíos
- **Filtros individuales**: Cada filtro debe tener `column`, `operator` y `value` - los inválidos se ignoran silenciosamente
- **Ordenamientos individuales**: Cada sort debe tener `order` válido (`asc`/`desc`). Si tiene `relationship`, la `column` va dentro de `relationship`; si no, debe tener `column` en la raíz
- **Relaciones**: Si se especifica `relationship`, debe tener `table` y `column` - las inválidas se ignoran
- **Prevención de ambigüedad**: Todas las columnas se prefijan automáticamente con el nombre de la tabla base para evitar errores SQL

### 🔒 **Comportamiento Seguro:**

[](#-comportamiento-seguro)

```
// ✅ Esto funciona perfectamente - ignora elementos inválidos
$request = Request::create('/', 'GET', [
    'filters' => [
        ['column' => 'name', 'operator' => '=', 'value' => 'John'], // ✅ Válido
        ['operator' => '=', 'value' => 'test'],                      // ❌ Ignorado (falta column)
        'invalid_string',                                            // ❌ Ignorado (no es array)
    ],
    'sorts' => [
        ['column' => 'created_at', 'order' => 'desc'],              // ✅ Válido (sort simple)
        ['order' => 'asc', 'relationship' => ['table' => 'users', 'column' => 'name']], // ✅ Válido (sort con relación)
        ['column' => 'name', 'order' => 'invalid'],                 // ❌ Ignorado (order inválido)
        ['order' => 'desc'],                                         // ❌ Ignorado (falta column para sort simple)
    ]
]);

// Solo se aplican los elementos válidos - la aplicación nunca se rompe
$query = FilterService::makeFiltersAndSorts($request, $query);
```

---

🔒 Prevención de Ambigüedad de Columnas
--------------------------------------

[](#-prevención-de-ambigüedad-de-columnas)

### ⚠️ **Problema Resuelto:**

[](#️-problema-resuelto)

Cuando haces JOINs entre tablas que tienen columnas con el mismo nombre (ej: `products.name` y `categories.name`), SQL puede generar errores de "ambiguous column name".

**Ejemplo del problema:**

```
-- ❌ Esto genera error: "ambiguous column name: name"
SELECT * FROM products
INNER JOIN categories ON products.category_id = categories.id
WHERE (name LIKE '%a%' OR description LIKE '%a%')
ORDER BY categories.name ASC
```

### ✅ **Solución Automática:**

[](#-solución-automática)

El paquete **prefija automáticamente** todas las columnas con el nombre de la tabla base para evitar ambigüedad:

```
-- ✅ SQL generado correctamente
SELECT * FROM products
INNER JOIN categories ON products.category_id = categories.id
WHERE (products.name LIKE '%a%' OR products.description LIKE '%a%')
ORDER BY categories.name ASC
```

### 🎯 **Casos de Uso Cubiertos:**

[](#-casos-de-uso-cubiertos)

- ✅ **Filtros con JOINs**: `name|description` se convierte en `products.name|products.description`
- ✅ **Operadores básicos**: `status = 1` se convierte en `products.status = 1`
- ✅ **Filtros IN/BETWEEN**: Se prefijan automáticamente con la tabla base
- ✅ **Ordenamientos con relaciones**: Funcionan correctamente sin conflictos

### 📝 **Ejemplo Práctico:**

[](#-ejemplo-práctico)

```
// ✅ Esto funciona perfectamente sin errores de ambigüedad
$request = Request::create('/', 'GET', [
    'filters' => [
        ['column' => 'name|description', 'operator' => 'like', 'value' => 'laptop']
    ],
    'sorts' => [
        [
            'order' => 'asc',
            'relationship' => ['table' => 'categories', 'column' => 'name']
        ]
    ]
]);

// Genera SQL sin ambigüedad automáticamente
$query = FilterService::makeFiltersAndSorts($request, Product::query());
```

---

📖 Documentación Completa
------------------------

[](#-documentación-completa)

### 🔍 Filtros

[](#-filtros)

Los filtros se envían como un array en el parámetro `filters` de la solicitud. Cada filtro tiene tres campos:

CampoTipoDescripción`column`stringNombre de la columna (o columnas separadas por `|` para LIKE)`operator`stringOperador de comparación`value`mixedValor a comparar (string, number, array según el operador)#### Ejemplos de Filtros

[](#ejemplos-de-filtros)

**Filtros de Comparación**```
{
    "filters": [
        { "column": "age", "operator": ">=", "value": 18 },
        { "column": "status", "operator": "=", "value": "active" },
        { "column": "price", "operator": "
