Consulta SQL con tablas relacionales 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
(
)
)
)