
Simplificación de consultas con relaciones con el método whereAttachedTo de Laravel
- Publicado el 19 mayo, 2025
- Palabras: 243
Navegar por las relaciones en el ORM Eloquent de Laravel se volvió más elegante con la introducción del método whereAttachedTo(), una poderosa abreviatura que simplifica una de las consultas de relaciones más comunes que escriben los desarrolladores.

#El desafío de los filtros de muchos a muchos (Many to Many)
Si has trabajado con el ORM Eloquent de Laravel, probablemente estés familiarizado con el patrón de filtrado de modelos basado en sus relaciones. Esto es especialmente común al trabajar con relaciones de muchos a muchos.
Por ejemplo, imagina que quieres encontrar todas las entradas de blog etiquetadas con etiquetas específicas. Tradicionalmente, escribirías algo como esto:
$tags = Tag::where('created_at', '>', now()->subMonth())->get();
$taggedPosts = Post::whereHas('tags', function ($query) use ($tags) {
$query->whereKey($tags);
})->get();
Si bien este enfoque funciona, añade verbosidad y complejidad al código. Es necesario definir un clousure, usar la variable $tags y comprender cómo construir correctamente la consulta interna.
#Añadir whereAttachedTo()
Laravel ahora ofrece una solución más elegante con el método whereAttachedTo():
$tags = Tag::where('created_at', '>', now()->subMonth())->get();
$taggedPosts = Post::whereAttachedTo($tags)->get();
Este nuevo método proporciona una forma clara y expresiva de filtrar modelos según sus relaciones BelongsToMany. El código es más corto, más legible y comunica mejor la intención: "Mostrar publicaciones asociadas a estas etiquetas".
#Especificando la relación
De forma predeterminada, whereAttachedTo() intentará inferir el nombre de la relación a partir del tipo de modelo que se le pase. Sin embargo, puede especificar explícitamente el nombre de la relación cuando sea necesario:
$taggedPosts = Post::whereAttachedTo($tags, 'tags')->get();
Esto es particularmente útil cuando tiene múltiples relaciones con el mismo tipo de modelo o cuando el nombre inferido puede no coincidir con el nombre de la relación real.
#Ejemplo práctico
Veamos un ejemplo práctico en un método controlador para una aplicación de blog:
class PostController extends Controller
{
public function indexByTags(Request $request)
{
// Get selected tags from request
$tagIds = $request->input('tags', []);
$tags = Tag::findMany($tagIds);
// Query posts with those tags
$posts = Post::whereAttachedTo($tags)
->with(['author', 'comments'])
->latest()
->paginate(15);
return view('posts.index', compact('posts', 'tags'));
}
}
Este método de controlador gestiona una solicitud para filtrar entradas de blog por etiquetas seleccionadas. El método whereAttachedTo() optimiza la consulta, haciéndola más legible y fácil de mantener.
Fuente: Harris Raftopoulos
Artículos relacionados
Inicia la conversación
Hazte miembro de Antonio Jenaro para comenzar a comentar.
Regístrate ahora¿Ya estás registrado? Inicia sesión