Если у меня есть две таблицы с соответствующими столбцами:
=====================
product_categories
=====================
id | name
=====================
=======================
products
=======================
id | category_id | name
=======================
И у меня есть следующие функции PHP:
// Returns an array of all rows from the products
function getProducts() { ... }
// returns the corresponding row to the given id of the product category
function getProductCategory($category_id) { ... }
В настоящее время я показываю список всех продуктов в таблице со следующими заголовками:
Где категория - это название категории, соответствующей category_id
продукта.
В настоящее время я использую цикл foreach для итерации продукта и вызова функции getProductCategory(...)
для каждого продукта:
<?php
...
$products = getProducts();
foreach ($products as $product) {
$product_category = getProductCategory($product['category_id']);
...
}
...
?>
Что будет большим количеством запросов к базе данных, если есть много продуктов со многими повторяющимися запросами.
Было бы хорошей практикой, если getProducts()
включает всю информацию о своей категории с помощью JOIN
в инструкции SQ
L?
Если вы хотите получить id
, category_name
и product_name
доступно каждый раз, вы должны сделать один метод и избегать, чтобы сделать один select
, затем foreach
по каждому продукту и прочий select
, чтобы получить все значения.
Поэтому попробуйте что-то вроде этого, может быть:
function getProductsData() {
$querie = 'SELECT
p.id, p.name,
pc.name as Category
FROM products as p
LEFT JOIN product_categories as pc on pc.id = p.category_id
ORDER BY p.name; -- optionnal
';
// Get the data and return them
// You should get an array with one row =
// id (of the product) / name (of the product) / Category (the name of the category)
}
Да, Присоединиться будет лучше. Это уменьшит количество запросов для получения категории. В противном случае вы можете сделать отдельный запрос для получения категорий, как указано ниже, но я предлагаю Join.
$products = getProducts();
$categoryIds = [];
foreach ($products as $product) {
$categoryIds[] = $product['category_id'];
...
}
$product_category = getProductCategory($categoryIds);
Вы должны изменить запрос в getProductCategory()
и добавить, where in
состоянии для сравнения идентификатора категории. В getProductCategory()
вы можете взорвать идентификаторы категорий, чтобы добавить их where in
пункт where in
.