29. Inner Join
Explorando el Proyecto Hotel: INNER JOIN entre Categorías y Habitaciones
En este post, profundizaremos en el desarrollo de nuestro sistema de reservas de hotel, centrándonos en cómo implementamos la relación entre categorías y habitaciones usando INNER JOIN en SQL.
¿Qué es INNER JOIN?
El INNER JOIN (unión interna) es un método SQL para realizar selecciones entre tablas relacionadas. En una base de datos relacional como la nuestra, nos permite conectar información de diferentes tablas que comparten relaciones lógicas.
En nuestro caso, estamos relacionando la tabla categorias con la tabla habitaciones, donde cada habitación pertenece a una categoría específica (Suite, Especial o Estándar).
Estructura de las Tablas
CREATE TABLE `categorias` (
`id` int(11) NOT NULL,
`ruta` text NOT NULL,
`color` text NOT NULL,
`tipo` text NOT NULL,
`img` text NOT NULL,
`descripcion` text NOT NULL,
`incluye` text NOT NULL,
`continental_alta` float NOT NULL,
`continental_baja` float NOT NULL,
`americano_alta` float NOT NULL,
`americano_baja` float NOT NULL,
`fecha` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
);
CREATE TABLE `habitaciones` (
`id_h` int(11) NOT NULL,
`tipo_h` int(11) NOT NULL,
`estilo` text NOT NULL,
`galeria` text NOT NULL,
`video` text NOT NULL,
`recorrido_virtual` text NOT NULL,
`descripcion_h` text NOT NULL,
`fecha_h` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
);Implementación del INNER JOIN
La relación se establece mediante el campo tipo_h en la tabla habitaciones, que referencia al id de la tabla categorias. Para implementar esto en nuestro código:
static public function mdlMostrarHabitaciones($tabla1, $tabla2, $valor)
{
$stmt = Conexion::conectar()->prepare("SELECT $tabla1.*, $tabla2.* FROM $tabla1
INNER JOIN $tabla2 ON $tabla1.id = $tabla2.tipo_h
WHERE ruta = :ruta");
$stmt->bindParam(":ruta", $valor, PDO::PARAM_STR);
$stmt->execute();
return $stmt->fetchAll();
}Flujo de Datos con $_GET["pagina"]
El sistema utiliza la variable $_GET["pagina"] para determinar qué categoría de habitaciones mostrar:
Desde la vista de categorías, enviamos el identificador de la categoría mediante
$_GET["pagina"]En
info_habitaciones.php, recibimos este valor:$valor = $_GET["pagina"];Usamos este valor para consultar las habitaciones correspondientes:
$habitaciones = ControladorHabitaciones::ctrMostrarHabitaciones($valor);
Controlador y Modelo de Habitaciones
El sistema sigue una arquitectura MVC (Modelo-Vista-Controlador):
Controlador (ControladorHabitaciones):
static public function ctrMostrarHabitaciones($valor)
{
$tabla1 = "categorias";
$tabla2 = "habitaciones";
return ModeloHabitaciones::mdlMostrarHabitaciones($tabla1, $tabla2, $valor);
}Modelo (ModeloHabitaciones):
static public function mdlMostrarHabitaciones($tabla1, $tabla2, $valor)
{
// Implementación del INNER JOIN mostrada anteriormente
}Gestión de Imágenes en la Galería
Las imágenes de cada habitación se almacenan como un array JSON en la base de datos:
[
"vistas/img/suite/oriental01.jpg",
"vistas/img/suite/oriental02.jpg",
"vistas/img/suite/oriental03.jpg",
"vistas/img/suite/oriental04.jpg"
]En la vista, decodificamos este JSON y mostramos las imágenes en un carrusel:
<?php $galeria = json_decode($habitaciones[0]["galeria"], true); ?>
<?php foreach ($galeria as $index => $img): ?>
<div class="carousel-item <?php echo $index === 0 ? 'active' : ''; ?>">
<img src="<?php echo $servidor . $img; ?>" class="d-block w-100">
</div>
<?php endforeach; ?>Conclusión
Este sistema demuestra cómo:
Relacionar tablas con INNER JOIN para obtener datos relacionados
Pasar parámetros entre vistas mediante
$_GETEstructurar el código en un patrón MVC
Manejar datos complejos como galerías de imágenes en formato JSON
Crear una interfaz dinámica que muestra información relacionada de manera eficiente
Comentarios
Publicar un comentario