Consulta SQL con tablas relacionales PHP

Consulta SQL con tablas relacionales PHP

Mysql, PHP

Si necesitamos realizar una única consulta SQL con tablas relacionales y almacenar los datos en un único array, podemos hacerlo de la siguiente forma.

Base de datos

Para este ejemplo:

# Crear base de datos
CREATE DATABASE prueba_php_min;

USE prueba_php;

# Crear tablas
CREATE TABLE product (
    id_product INT AUTO_INCREMENT PRIMARY KEY,
    reference VARCHAR(50) NOT NULL,
    name VARCHAR(100) NOT NULL
);

CREATE TABLE product_image (
    id_image INT AUTO_INCREMENT PRIMARY KEY,
    id_product INT,
    url VARCHAR(255),
    FOREIGN KEY (id_product) REFERENCES product(id_product) ON DELETE CASCADE
);

# Información de ejemplo
INSERT INTO product (reference, name, state) VALUES 
    ('REF123', 'Producto A', 1),
    ('REF456', 'Producto B', 1),
    ('REF789', 'Producto C', 0);
    
INSERT INTO product_image (id_product, url) VALUES 
    (1, 'http://example.com/image1.jpg'),
    (1, 'http://example.com/image2.jpg'),
    (2, 'http://example.com/image3.jpg');

Tabla product

Con las columnas:

  • id_product
  • reference
  • name

Tabla product_image

Con las columnas:

  • id_image
  • id_product
  • url

Consulta SQL

Realizamos una única consulta SQL y almacenamos en el array $data la información. Si un producto no tiene información en la tabla relacional, simplemente esta información será un array vacío.

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "prueba_php_min";

/* Conexión */
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) die("Conexión fallida: " . $conn->connect_error);

/* Consulta */
$sql = "SELECT 
p.id_product, p.reference, p.name, 
pi.id_image, pi.url
FROM product p
LEFT JOIN product_image pi 
ON p.id_product = pi.id_product";

$result = $conn->query($sql);
$data = [];

if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        $id_product = $row['id_product'];
        
        if (!isset($data[$id_product])) {
            $data[$id_product] = [
                'id_product' => $row['id_product'],
                'reference' => $row['reference'],
                'name' => $row['name'],
                'images' => []
            ];
        }       
                
        /* Imágenes */
        if (!is_null($row['id_image']) && !isset($data[$id_product]['images'][$row['id_image']])) {
            $data[$id_product]['images'][$row['id_image']] = [
                'id_image' => $row['id_image'],
                'url' => $row['url']
            ];
        }

    }
}

/* Cerrar conexión */
$conn->close();

/* Mostrar los datos */
print("<pre>" . print_r($data, true) . "</pre>");

Nos imprimirá lo siguiente:

Array
(
    [1] => Array
        (
            [id_product] => 1
            [reference] => REF123
            [name] => Producto A
            [images] => Array
                (
                    [1] => Array
                        (
                            [id_image] => 1
                            [url] => http://example.com/image1.jpg
                        )

                    [2] => Array
                        (
                            [id_image] => 2
                            [url] => http://example.com/image2.jpg
                        )

                )

        )

    [2] => Array
        (
            [id_product] => 2
            [reference] => REF456
            [name] => Producto B
            [images] => Array
                (
                    [3] => Array
                        (
                            [id_image] => 3
                            [url] => http://example.com/image3.jpg
                        )

                )

        )

    [3] => Array
        (
            [id_product] => 3
            [reference] => REF789
            [name] => Producto C
            [images] => Array
                (
                )

        )

)

Leave a reply