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

sql
Copy
Download
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:

php
Copy
Download
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:

  1. Desde la vista de categorías, enviamos el identificador de la categoría mediante $_GET["pagina"]

  2. En info_habitaciones.php, recibimos este valor:

    php
    Copy
    Download
    $valor = $_GET["pagina"];
  3. Usamos este valor para consultar las habitaciones correspondientes:

    php
    Copy
    Download
    $habitaciones = ControladorHabitaciones::ctrMostrarHabitaciones($valor);

Controlador y Modelo de Habitaciones

El sistema sigue una arquitectura MVC (Modelo-Vista-Controlador):

Controlador (ControladorHabitaciones):

php
Copy
Download
static public function ctrMostrarHabitaciones($valor)
{
    $tabla1 = "categorias";
    $tabla2 = "habitaciones";
    return ModeloHabitaciones::mdlMostrarHabitaciones($tabla1, $tabla2, $valor);
}

Modelo (ModeloHabitaciones):

php
Copy
Download
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:

json
Copy
Download
[
    "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
Copy
Download
<?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:

  1. Relacionar tablas con INNER JOIN para obtener datos relacionados

  2. Pasar parámetros entre vistas mediante $_GET

  3. Estructurar el código en un patrón MVC

  4. Manejar datos complejos como galerías de imágenes en formato JSON

  5. Crear una interfaz dinámica que muestra información relacionada de manera eficiente

Comentarios

Entradas más populares de este blog

37. Enviando datos de la reserva - parte 1

40-pintar con php

42. Validar cruce de fechas - parte 1