Cómo Optimizar Query Scopes en Laravel para Autocompletado IDE

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.

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 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:

1<?php
2namespace App\Models;
3 
4use Illuminate\Database\Eloquent\Model;
5 
6class User extends Model
7{
8 /**
9 * Scope a query to only include active users.
10 *
11 * @param \Illuminate\Database\Eloquent\Builder $query
12 * @return void
13 */
14 public function scopeActive($query)
15 {
16 $query->where('active', 1);
17 }
18}

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

1Route::get('/users', function () {
2 $users = User::query();
3 
4 dd($users);
5});

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

1Illuminate\Database\Eloquent\Builder

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

1<?php
2namespace App\Models;
3 
4use Illuminate\Database\Eloquent\Model;
5 
6class User extends Model
7{
8 // ...
9 
10 public function newEloquentBuilder($query): UserBuilder
11 {
12 return new UserBuilder($query);
13 }
14}

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:

1<?php
2 
3namespace App\Models\Builder;
4 
5use Illuminate\Database\Eloquent\Builder;
6 
7class UserBuilder extends Builder
8{
9 public function active(): static
10 {
11 return $this->where('active', 1)
12 }
13 
14 // cualquier otro scope que tengamos definido
15}

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

1<?php
2namespace App\Models;
3 
4use Illuminate\Database\Eloquent\Model;
5 
6class User extends Model
7{
8 // ...
9 
10 public static function query(): UserBuilder
11 {
12 return parent::query();
13 }
14 
15 public function newEloquentBuilder($query): UserBuilder
16 {
17 return new UserBuilder($query);
18 }
19}

Beneficio?

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

Espero que les haya gustado la lectura.

Angel Cruz's avatar
Autor
Angel Cruz