руководство/10. Сложные запросы.md
Сложные запросы
Итак, прошлые статьи показывали, как работает класс Database в стандартных ситуациях. Но что, если мы хотим сделать сложный запрос, который не может быть представлен в виде массива условий?
Для этого мы будем использовать методы класса Database: query и execute.
Метод query
Метод query позволяет выполнить запрос и получить результат в виде ассоциированного массива.
Он принимает два параметра:
string $query: запрос SQL;array $params(не обязательный): массив параметров запроса (плейсхолдеров). По умолчанию пустой массив.
Возвращаемое значение: array|false - ассоциативный массив с результатом запроса или false в случае ошибки.
Пример:
$sql = "SELECT * FROM users WHERE #key_1 = #value_1";
$params = ['key_1' => 'id', 'value_1' => 1];
$result = $db->query($sql, $params);
Внимание! Как вы заметили в примере выше, в запросе используются плейсхолдеры #key_1 и #value_1. Это означает, что в массиве $params должны быть ключи key_1 и value_1, а значениями должны быть id и 1. Таких плейсхолдеров в запросе может быть сколько угодно.
ВАЖНО! Плейсхолдеры в запросе должны быть обязательно в формате #key_номер и #value_номер, иначе они не будут заменены. Плейсхолдер #key_номер может быть без #value_номер, но не наоборот.
И ещё важное замечание! Метод query не может быть использован для запросов, которые не начинаются с SELECT. При других запросах он выдаст false.
Метод execute
Метод execute позволяет выполнить запрос, который изменяет данные в базе данных (например, INSERT, UPDATE, DELETE).
Он принимает два параметра:
string $query: запрос SQL;array $params(не обязательный): массив параметров запроса (плейсхолдеров). По умолчанию пустой массив.
Возвращаемое значение: int|false - Количество затронутых строк или false в случае ошибки.
Пример:
$sql = "INSERT INTO [dbo].[users] (#key_1, #key_2, #key_3) VALUES (#value_1, #value_2, #value_3) WHERE #key_4 = #value_4";
$params = [
'key_1' => 'id', 'value_1' => 1,
'key_2' => 'name', 'value_2' => 'Ivan',
'key_3' => 'age', 'value_3' => 25,
'key_4' => 'id', 'value_4' => 1
];
$result = $db->execute($sql, $params);
ВАЖНО! Метод execute не может быть использован для запросов, которые начинаются с SELECT. При других запросах он выдаст false.
Управление транзакциями
За управление транзакциями отвечает класс TransactionManager, который вызывается через свойство transaction класса Database.
Метод inTransaction
Метод inTransaction проверяет, находится ли соединение в транзакции.
Он не принимает параметров.
Возвращаемое значение: bool: true, если в транзакции, иначе false.
Пример:
if ($db->transaction->inTransaction())
echo 'В транзакции';
Метод begin
Метод begin инициализирует транзакцию.
Он не принимает параметров.
Возвращаемое значение: нет.
Пример:
$db->transaction->begin();
if ($db->transaction->inTransaction())
echo 'В транзакции';
# ВЫВОД: В транзакции
Метод commit
Метод commit завершает транзакцию.
Он не принимает параметров.
Возвращаемое значение: bool: результат отправки.
Пример:
$db->transaction->begin();
// ...
$db->transaction->commit();
Метод rollback
Метод rollback откатывает транзакцию.
Он не принимает параметров.
Возвращаемое значение: нет.
Пример:
$db->transaction->begin();
try {
// ...
$db->transaction->commit();
}
catch (PDOException) {
$db->transaction->rollback();
}
Итак, мы рассмотрели все возможные способы работы с данными и таблицами в классе Database.