руководство/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.

Предыдущий пункт | На главную