---
title: "Cómo Optimizar Query Scopes en Laravel para Autocompletado IDE"
excerpt: "Optimiza tus query scopes en Laravel para un autocompletado más amigable en tu IDE favorito. Aprende cómo configurarlos adecuadamente y maximiza la eficiencia de tus consultas SQL. Simplifica tu flujo de trabajo y mejora tu productividad con este tutorial."
date: "2024-02-19T01:38:00.000Z"
category: "Laravel"
seo_title: "Query Scopes en Laravel con autocompletado IDE: UserBuilder"
seo_description: "Mejora el autocompletado de query scopes en Laravel con el patrón UserBuilder. Sobreescribe newEloquentBuilder() y query() para que tu IDE sugiera todos los scopes del modelo correctamente."
author:
  name: "angel cruz"
  picture: "https://angelcruzdevcdn.nyc3.cdn.digitaloceanspaces.com/images/me/angel-cruz.png"
ogImage:
  url: "/images/open-graph/laravel-opengraph-image.png"
---

Como sabemos, una de las características más poderosas de Laravel son los query scopes ya que son fáciles de usar, los query scopes facilita la creación de consultas SQL complejas que en algunos casos se pueden volver a aplicar la misma condición a otros modelos dentro de tu aplicación.

[En un artículo anterior](/post/como-se-usan-los-query-scopes) hablabamos que los query scopes son una alternativa para optimizar nuestro código cuando necesitamos hacer condiciones específicas en nuestras consultas.

En ese artículo teniamos el siguiente ejemplo:

```php
<?php
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
    /**
     * Scope a query to only include active users.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return void
     */
    public function scopeActive($query)
    {
        $query->where('active', 1);
    }
}
```

Ahora vamos a realizar una serie de cambios para permitir que nuestro IDE pueda sugerirnos todos los scopes que tengamos para nuestro modelo `User`


Una de las cosas que debemos tener en cuenta es que cada vez que hagamos una consulta usando `Eloquent` estamos pasando por el propio `Query Builder` por lo que siempre debemos pasar como parámetro la `query` que se esta ejecutando para poder encadenar todos los métodos adicionales que vayamos a aplicar en la consulta.

Ejemplo:

Si tenemos esta ruta 

```php
Route::get('/users', function () {
     $users = User::query();
	
	   dd($users);
});
```

El resultado de ese `dd()` sería el siguiente:

```html
Illuminate\Database\Eloquent\Builder
```

Por lo que para poder hacer todo lo que dije arriba debemos hacer lo siguiente en nuestro modelo `User`:

```php
<?php
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
		// ...
	
    public function newEloquentBuilder($query): UserBuilder
    {
        return new UserBuilder($query);
    }	
}
```

Y ahora, ese `UserBuilder` donde lo colocamos? Bueno, esto realmente depende de como tengas organizado tu proyecto, pero yo lo tengo dentro de una carpeta llamada `Builders` dentro de `Models`.

Y el contenido de ese `UserBuilder` será esto:

```php
<?php

namespace App\Models\Builder;

use Illuminate\Database\Eloquent\Builder;

class UserBuilder extends Builder
{
    public function active(): static
    {
        return $this->where('active', 1)
    }
	
	  // cualquier otro scope que tengamos definido
}
```

Y ya para finalizar, en nuestro modelo `User` debemos hacer un pequeño cambio más:


```php
<?php
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
		// ...

    public static function query(): UserBuilder // [tl! **]
    { // [tl! **]
        return parent::query(); // [tl! **]
    } // [tl! **]
	
    public function newEloquentBuilder($query): UserBuilder
    {
        return new UserBuilder($query);
    }	
}
```

## Beneficio?

A parte de ayudar al autocompletado del IDE pues no hay ningun otro.


Espero que les haya gustado la lectura.

---

## Sitemap

Índice completo del sitio: [/sitemap.md](https://angelcruz.dev/sitemap.md)

Canónico HTML: [https://angelcruz.dev/post/optimizar-query-scopes-laravel-autocompletado-ide](https://angelcruz.dev/post/optimizar-query-scopes-laravel-autocompletado-ide)
