Существует ли в PHP более краткий способ выполнить запрос к базе данных?

Как можно улучшить запрос для вывода списка товаров, учитывая наличие товара хотя бы в одном из магазинов в каждом столбце? Вот мой текущий подход:
$sql = "SELECT * FROM products WHERE category = ? AND (t1 > 0 OR t2 > 0 OR t3 > 0 OR t4 > 0 OR t5 > 0 OR t6 > 0 OR t7 > 0 OR t8 > 0 OR t9 > 0 OR t10 > 0 OR t11 > 0 OR t12 > 0 OR t13 > 0 OR t14 > 0 OR t15 > 0 OR t16 > 0 OR t17 > 0)";
Но я уверен, что можно найти более изящное и эффективное решение. Может быть, есть какие-то подсказки или лучшие практики?
  • 14 ноября 2023 г. 15:51
Ответы на вопрос 2
В PHP существует несколько способов выполнить запрос к базе данных, который может быть более кратким и удобным. Один из таких способов - использование PDO (PHP Data Objects), которая предоставляет унифицированный интерфейс для взаимодействия с различными базами данных.

Вот пример более краткого способа выполнить ваш запрос с использованием PDO:

```php
$category = 'your_category';
$db = new PDO('your_connection_string');
$stmt = $db->prepare("SELECT * FROM products WHERE category = :category AND (t1 > 0 OR t2 > 0 OR t3 > 0 OR t4 > 0 OR t5 > 0 OR t6 > 0 OR t7 > 0 OR t8 > 0 OR t9 > 0 OR t10 > 0 OR t11 > 0 OR t12 > 0 OR t13 > 0 OR t14 > 0 OR t15 > 0 OR t16 > 0 OR t17 > 0)");
$stmt->bindParam(':category', $category);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
```

В этом примере мы используем подготовленное выражение и привязываем значение переменной $category к параметру :category в запросе. Затем мы выполняем запрос с помощью метода execute() и получаем результаты с помощью метода fetchAll(). Результаты возвращаются в виде массива ассоциативных массивов.

Что касается вашего запроса для вывода списка товаров, то вам может быть полезно использование таблицы и связующей таблицы для хранения информации о наличии товаров в каждом магазине. Это поможет упростить и улучшить ваш запрос, например, с помощью объединения таблиц или использования подзапросов.

Вот пример улучшенного запроса с использованием таблицы и связующей таблицы:

```sql
SELECT p.* 
FROM products p
INNER JOIN products_stores ps ON p.id = ps.product_id
WHERE p.category = ? AND ps.quantity > 0
```

В этом запросе мы связываем таблицы products и products_stores через поле product_id и фильтруем записи по категории и наличию товара в одном из магазинов. Обратите внимание, что здесь использован символ ? как заполнитель для категории, которая должна быть передана через подготовленное выражение в PHP.

Надеюсь, эти примеры помогут вам улучшить ваши запросы к базе данных.
Для того, чтобы решить задачу, которую вы поставили, вам понадобится использовать функцию generateTFilter. Она создает фильтр для запроса в базу данных. Вы указываете количество переменных t, и функция генерирует фильтр, который будет проверять, что значения каждой из этих переменных больше нуля.

Но что будет, если количество магазинов увеличится до 50 или 100? Как вы будете учитывать приходы и списания со складов? И что делать с товарами в пути? Вам следует очень тщательно продумать архитектуру вашей базы данных.

Одно из возможных решений - хранить остатки не в отдельных колонках, а в отдельной таблице. Тогда вы сможете использовать оператор WHERE … IN для фильтрации данных.

Однако я уверен, что существует более элегантное и разумное решение. Вы сможете найти его, изучив концепцию нормализации баз данных. Существует десять основных норм, которые помогут вам разработать более эффективную структуру базы данных.

Если текущий вариант вас устраивает, то он вполне приемлем.
Похожие вопросы