Curso de Laravel Gohu
Ejecutar consultas Query Builder con Laravel Gohu
Por Víctor Peña · Actualizado el
En esta oportunidad aprenderemos a ejecutar consultas con el Query Builder de Laravel utilizando Laravel Gohu. El constructor de consultas nos ofrece una interfaz fluida para construir y ejecutar consultas a la base de datos sin escribir SQL directamente, y con Laravel Gohu podremos ver cada resultado en formato JSON al instante.
¡Hola! ¡Bienvenidos al curso de Laravel Gohu!
¡Empecemos!
Información. A diferencia de Eloquent ORM, el Query Builder no requiere modelos: trabajamos directamente sobre las tablas mediante la fachada
DB, que Laravel Gohu reconoce sin necesidad de importarla.
Preparar el entorno de Laravel Gohu
Abre el panel de Laravel Gohu desde la paleta de comandos, selecciona el proyecto Mascotas con el ícono de carpeta y comprueba que el indicador de estado esté en verde. Escribiremos las consultas en el área de código y pulsaremos ▶ Run para ver el resultado.
DB::table('mascotas')->get();
Obtener registros de una tabla
Con el Query Builder accedemos a una tabla mediante el método table() y obtenemos sus registros con get():
DB::table('mascotas')->get();
Ejecutamos el código y obtendremos, en el área de resultados, el total de registros y los datos de la tabla «mascotas» en formato JSON.
Si solo necesitamos el primer registro, usamos first():
DB::table('mascotas')->first();
Filtrar y ordenar los resultados
Podemos aplicar condiciones con where(), ordenar con orderBy() y limitar la cantidad con limit(). Obtengamos las mascotas de tipo «Perro» ordenadas por edad:
DB::table('mascotas')
->where('tipo', 'Perro')
->orderBy('edad', 'asc')
->limit(10)
->get();
También podemos combinar varias condiciones. Por ejemplo, mascotas de tipo «Perro» con edad mayor a 2 años:
DB::table('mascotas')
->where('tipo', 'Perro')
->where('edad', '>', 2)
->get();
Seleccionar columnas específicas
Cuando no necesitamos todas las columnas, las indicamos con select():
DB::table('mascotas')
->select('nombre', 'raza', 'edad')
->get();
Consultas con joins
El Query Builder facilita la combinación de tablas mediante joins. Unamos la tabla «mascotas» con «refugios» para mostrar el nombre de cada mascota junto al nombre de su refugio:
DB::table('mascotas')
->join('refugios', 'mascotas.refugio_id', '=', 'refugios.id')
->select('mascotas.nombre as mascota', 'refugios.nombre as refugio', 'refugios.ciudad')
->get();
Funciones de agregación
El Query Builder incluye métodos para realizar cálculos directamente en la base de datos, como contar, sumar o promediar. Contemos cuántas mascotas hay registradas:
DB::table('mascotas')->count();
Obtengamos la edad promedio de las mascotas:
DB::table('mascotas')->avg('edad');
Y el precio total de las vacunas registradas:
DB::table('vacunas')->sum('precio');
Joins con agrupamiento y agregación
El Query Builder no se limita a filtros simples: nos permite combinar tablas, agrupar resultados, aplicar subconsultas y realizar cálculos avanzados.
Podemos combinar un join con groupBy() para calcular datos por grupo. Contemos cuántas mascotas alberga cada refugio:
DB::table('refugios')
->join('mascotas', 'refugios.id', '=', 'mascotas.refugio_id')
->select('refugios.nombre', DB::raw('COUNT(mascotas.id) as total_mascotas'))
->groupBy('refugios.id', 'refugios.nombre')
->orderBy('total_mascotas', 'desc')
->get();
Aquí utilizamos DB::raw() para incluir la función COUNT() de SQL dentro del select().
Filtrar grupos con having
Mientras que where() filtra filas individuales, having() filtra los grupos ya calculados. Obtengamos únicamente los refugios que tienen más de 2 mascotas:
DB::table('refugios')
->join('mascotas', 'refugios.id', '=', 'mascotas.refugio_id')
->select('refugios.nombre', DB::raw('COUNT(mascotas.id) as total_mascotas'))
->groupBy('refugios.id', 'refugios.nombre')
->having('total_mascotas', '>', 2)
->get();
Left join
Con join(), que es un inner join, solo aparecen los refugios que tienen al menos una mascota. Si queremos incluir también los refugios sin mascotas, usamos leftJoin():
DB::table('refugios')
->leftJoin('mascotas', 'refugios.id', '=', 'mascotas.refugio_id')
->select('refugios.nombre', DB::raw('COUNT(mascotas.id) as total_mascotas'))
->groupBy('refugios.id', 'refugios.nombre')
->get();
Varios joins con tabla pivote
Cuando trabajamos con una relación muchos a muchos, podemos encadenar varios joins pasando por la tabla pivote. Mostremos cada mascota junto con las vacunas que se le han aplicado y la fecha correspondiente:
DB::table('mascotas')
->join('mascota_vacuna', 'mascotas.id', '=', 'mascota_vacuna.mascota_id')
->join('vacunas', 'mascota_vacuna.vacuna_id', '=', 'vacunas.id')
->select('mascotas.nombre as mascota', 'vacunas.tipo as vacuna', 'mascota_vacuna.fecha')
->orderBy('mascota_vacuna.fecha', 'desc')
->get();
Subconsultas
También podemos anidar una consulta dentro de otra. Obtengamos las mascotas que pertenecen a refugios de la ciudad «Lima - Perú» usando una subconsulta con whereIn():
DB::table('mascotas')
->whereIn('refugio_id', function ($query) {
$query->select('id')
->from('refugios')
->where('ciudad', 'Lima - Peru');
})
->get();
Condiciones dinámicas con when
El método when() nos permite añadir condiciones solo si se cumple un valor, evitando if externos. Filtramos por tipo únicamente si la variable tiene valor:
$tipo = 'Perro';
DB::table('mascotas')
->when($tipo, function ($query, $tipo) {
$query->where('tipo', $tipo);
})
->orderBy('edad', 'asc')
->get();
Una consulta completa
Combinemos varias de estas técnicas en una sola consulta. Obtendremos los refugios que albergan 2 o más perros, mostrando el total de perros y la edad promedio, ordenados de mayor a menor y limitados a los 5 primeros:
DB::table('refugios')
->join('mascotas', 'refugios.id', '=', 'mascotas.refugio_id')
->where('mascotas.tipo', 'Perro')
->select(
'refugios.nombre',
'refugios.ciudad',
DB::raw('COUNT(mascotas.id) as total_perros'),
DB::raw('ROUND(AVG(mascotas.edad), 1) as edad_promedio')
)
->groupBy('refugios.id', 'refugios.nombre', 'refugios.ciudad')
->having('total_perros', '>=', 2)
->orderBy('total_perros', 'desc')
->limit(5)
->get();
Ejecutamos el código en Laravel Gohu y en el área de resultados veremos un JSON con cada refugio, su total de perros y la edad promedio calculada directamente en la base de datos. Este tipo de consulta es ideal para reportes y estadísticas, donde necesitamos combinar joins, agrupamientos y cálculos en una sola operación.
Para cerrar
Ejecutar consultas con el Query Builder en Laravel Gohu nos brinda una forma flexible y potente de interactuar con la base de datos, especialmente útil cuando trabajamos con joins, agregaciones o tablas que no tienen un modelo asociado.
En la siguiente lección veremos cómo ejecutar SQL puro con DB::select().
Saludos y éxitos.
Norvic Software
Desarrollamos el software que tu empresa necesita
Somos una fábrica de software en Bolivia. Construimos sistemas a medida y aplicaciones móviles, y llevamos Inteligencia Artificial a las empresas que ya tienen un sistema funcionando.
- Chatbots con Inteligencia Artificial
- Creación de agentes de IA
- Integración de IA en tus sistemas
- Desarrollo de software a medida
- Aplicaciones móviles iOS y Android
- Consultoría y asesoramiento técnico
Cotización sin costo · Respuesta directa por WhatsApp