Buen aporte 😉
Optimización de consultas de bases de datos con los Query Scopes de Laravel
- Publicado el 02 septiembre, 2024
- Palabras: 491
Los query scopes de Laravel brindan una forma elegante de encapsular restricciones de consulta comunes, lo que hace que las consultas de la base de datos sean más legibles, reutilizables y fáciles de mantener. Veamos cómo puedes aprovechar los ámbitos de consulta en tus aplicaciones de Laravel.
#Query Scopes básicos
Para definir un query scope, escriba un método en el modelo con el prefijo ‘scope’:
class User extends Model
{
public function scopeActive($query)
{
return $query->where('status', 'active');
}
}
Ahora puedes usar este scope en tus consultas de este modo:
$activeUsers = User::active()->get();
#Scope con parámetros
Los scopes también pueden aceptar parámetros:
class Post extends Model
{
public function scopePopular($query, $minViews)
{
return $query->where('views', '>', $minViews);
}
}
// Uso
$popularPosts = Post::popular(1000)->get();
#Combinar múltipes scopes
Una de las ventajas de los query scopes es su componibilidad:
class Product extends Model
{
public function scopeActive($query)
{
return $query->where('is_active', true);
}
public function scopeInStock($query)
{
return $query->where('stock', '>', 0);
}
public function scopeInCategory($query, $category)
{
return $query->where('category', $category);
}
}
// Uso
$featuredElectronics = Product::active()
->inStock()
->inCategory('electronics')
->orderBy('featured', 'desc')
->get();
#Scopes de ámbito global
Los scopes de ámbito global se aplican automáticamente a todas las consultas del modelo:
class User extends Model
{
protected static function booted()
{
static::addGlobalScope('active', function (Builder $builder) {
$builder->where('active', true);
});
}
}
// Nos devolverá solo los usuarios activos
$users = User::all();
También puedes definir un scope global como una clase separada:
class ActiveScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder->where('active', true);
}
}
class User extends Model
{
protected static function booted()
{
static::addGlobalScope(new ActiveScope);
}
}
#Eliminar scopes de ámbito global
Puedes eliminar un scope de ámbito global siempre que lo necesites:
User::withoutGlobalScope('active')->get();
// o
User::withoutGlobalScopes()->get();
#Scopes dinámicos
Puede crear scopes dinámicos para lograr la máxima flexibilidad:
class User extends Model
{
public function scopeOfType($query, $type)
{
return $query->where('type', $type);
}
}
// Uso
$users = User::ofType('admin')->get();
Los query scopes en Laravel ofrecen una forma eficaz de encapsular la lógica de consulta, lo que promueve un código más limpio y fácil de mantener. Al aprovechar los scopes, puedes crear consultas expresivas y reutilizables que hacen que las interacciones de la base de datos de su aplicación sean más sólidas y fáciles de entender.
Antonio Jenaro
Web Developer
Fuente: Harris Raftopoulos
Comentarios (1)
Inicia la conversación
Hazte miembro de Antonio Jenaro para comenzar a comentar.
Regístrate ahora¿Ya estás registrado? Inicia sesión