El INNER JOIN en Laravel 11 y 12 permite combinar registros de dos o más tablas cuando existe una relación entre ellas. Es fundamental para reportes, filtros avanzados y consultas optimizadas en aplicaciones empresariales.
En esta guía aprenderás paso a paso:
- Qué es un INNER JOIN
- Cómo usarlo con Query Builder
- Cómo usarlo con Eloquent
- Cuándo elegir cada enfoque
- Buenas prácticas de optimización

¿Qué es un INNER JOIN en SQL?
Un INNER JOIN devuelve únicamente los registros que coinciden en ambas tablas según una condición definida.
Ejemplo SQL base
SELECT pedidos.*, users.name
FROM pedidos
INNER JOIN users ON users.id = pedidos.user_id;Resultado:
Solo se obtienen pedidos que tengan un usuario asociado.
INNER JOIN con Query Builder en Laravel 11 y 12
El Query Builder es ideal cuando necesitas consultas directas, reportes o filtros complejos.

Laravel 11 y 12 mantienen la misma sintaxis para JOIN.
Paso 1: Importar DB
use Illuminate\Support\Facades\DB;Paso 2: INNER JOIN básico
$pedidos = DB::table('pedidos')
->join('users', 'users.id', '=', 'pedidos.user_id')
->select('pedidos.*', 'users.name as cliente')
->get();Explicación:
join()→ ejecuta INNER JOIN- Primer parámetro → tabla relacionada
- Segundo y cuarto → columnas comparadas
select()→ evita * en producción
Paso 3: INNER JOIN con alias (recomendado)
Los alias mejoran claridad y rendimiento en consultas complejas.
$pedidos = DB::table('pedidos as p')
->join('users as u', 'u.id', '=', 'p.user_id')
->select('p.id', 'p.total', 'u.name as cliente')
->get();Paso 4: INNER JOIN con condición adicional
Puedes agregar condiciones dentro del JOIN.
$pedidos = DB::table('pedidos as p')
->join('users as u', function ($join) {
$join->on('u.id', '=', 'p.user_id')
->where('u.activo', 1);
})
->select('p.*', 'u.name')
->get();Esto filtra solo usuarios activos dentro del JOIN.
INNER JOIN con múltiples tablas
Común en sistemas de ventas, inventarios o reportes.
$ventas = DB::table('pedidos as p')
->join('users as u', 'u.id', '=', 'p.user_id')
->join('tipo_comprobantes as tc', 'tc.id', '=', 'p.tipo_comprobante_id')
->select(
'p.id',
'p.total',
'u.name as cliente',
'tc.nombre as comprobante'
)
->get();INNER JOIN con Eloquent en Laravel
Eloquent permite trabajar con relaciones sin escribir JOIN manualmente.
Paso 1: Definir relaciones
En el modelo Pedido:
public function user()
{
return $this->belongsTo(User::class);
}Paso 2: Usar eager loading (alternativa profesional)
$pedidos = Pedido::with('user')->get();Esto ejecuta consultas optimizadas sin JOIN directo.
Paso 3: Forzar INNER JOIN con Eloquent
Si necesitas filtro directo sobre tabla relacionada:
$pedidos = Pedido::join('users', 'users.id', '=', 'pedidos.user_id')
->select('pedidos.*', 'users.name as cliente')
->get();Query Builder vs Eloquent: ¿Cuál usar?
La elección depende del contexto del proyecto.
| Escenario | Recomendación |
|---|---|
| API estructurada | Eloquent + with() |
| Reportes complejos | Query Builder |
| Filtros sobre tabla relacionada | JOIN |
| Arquitectura limpia | Relaciones |
Buenas Prácticas de Optimización
Un INNER JOIN mal optimizado puede afectar el rendimiento.
Usa índices en claves foráneas
ALTER TABLE pedidos ADD INDEX (user_id);Evita select *
Selecciona solo columnas necesarias.
Usa alias en consultas grandes
->join('users as u', ...)Analiza consultas con EXPLAIN
En MySQL para verificar uso de índices.
Diferencia entre INNER JOIN y LEFT JOIN
Comprender esta diferencia evita errores lógicos.
->join() // INNER JOIN
->leftJoin() // LEFT JOIN- INNER JOIN → Solo coincidencias
- LEFT JOIN → Devuelve todos los registros de la tabla principal
Ejemplo Real Paso a Paso (Sistema de Pedidos)
Objetivo:
Listar pedidos pagados con nombre del cliente.
Paso 1: Crear consulta
$pedidos = DB::table('pedidos as p')
->join('users as u', 'u.id', '=', 'p.user_id')
->where('p.estado', 'pagado')
->select('p.id', 'p.total', 'u.name')
->orderBy('p.id', 'desc')
->get();Paso 2: Retornar en controlador
return view('pedidos.index', compact('pedidos'));Conclusión
El INNER JOIN en Laravel 11 y 12 es una herramienta clave para desarrollar aplicaciones robustas y optimizadas.
Resumen práctico:
- Usa
join()para reportes y filtros avanzados - Usa
with()para relaciones limpias - Indexa siempre claves foráneas
- Evita
select * - Analiza rendimiento en producción
SI deseas Inner join con PHP puro, aquí te dejo un link que hablo sobre el tema.
Además, si deseas manejarlo con Datatables usando Yajra, Ingresa Aquí.
