Реализация подключения к одной базе данных или нескольким остается на усмотрение разработчика сайта. Тем не менее рекомендуются два варианта:
DB
В папке "database" расположен файл
"DB.php", содержащий статический класс
"DB". Через этот класс можно обращаться к базе данных через
PDO, соответственно есть поддержка
MySQL и
PostgreSQL.
Установка подключения описана в разделе данной инструкции «
Настройка».
XD ORM
На самом деле
XD ORM - это оболочка над
PHP PDO, разработанная специально для фреймворка
HLEB. Она простая и соответствует общему предназначению микрофреймворка.
XD ORM не входит в изначальную комплектацию фреймворка, поэтому её необходимо скопировать в папку с библиотеками
vendor/phphleb из репозитория
github.com/phphleb/xdorm
или установить при помощи
Composer:
$ composer require phphleb/xdorm
Подключение к проекту:
// Файл /app/Optional/MainConnect.php
... [
"XdORM\XD" => "vendor/phphleb/xdorm/XD.php"
] ...
Вы можете составлять запросы в базовом стиле
SQL для выбранной СУБД (любая, поддерживаемая
PDO). Основная задача, реализуемая в данной
ORM, это превратить строку запроса в защищённую строку запроса.
При знании синтаксиса
SQL можно приступать к написанию модели сразу. Этот синтаксис трактуется следующим образом для команд:
use XdORM\XD;
XD::any(); // 'ANY'
XD::any_words(); // 'ANY_WORDS'
XD::anyWords(); // 'ANY WORDS'
XD::any()->words(); // 'ANY WORDS'
Для табличных названий достаточно передать их в массиве:
$query = XD::select(['id', 'name', 'email'])->from(['users']); // SELECT `id`, `name`, `email` FROM `users`
Значения вставляются как есть, но все строковые значения, кроме операторов и спецсимволов
SQL, будут проверены встроенными средствами
PDO:
$query = XD::select('*')->from(['users'])->where(['name'], '!=', "d'Artanyan")->and(['id'], '=', 1)->limit(1);
// SELECT * FROM `users` WHERE `name` != 'd\'Artanyan' AND `id` = 1 LIMIT 1
$query = XD::select('*')->from(['users'])->where(['id'])->in('(', 15, ',', 43, ',', 60, ',', 71, ')');
// SELECT * FROM `users` WHERE `id` IN ( 15, 43, 60, 71 )
Чтобы передать массив значений существует специальный метод
setList():
$ids = [15, 43, 60, 71];
$query = XD::select('*')->from(['users'])->where(['id'])->in('(', XD::setList($ids), 90,')');
// SELECT * FROM `users` WHERE `id` IN ( 15, 43, 60, 71, 90 )
Соединение частей запроса может быть произведено между возвращаемыми объектами
XD в любом порядке:
$select_user_id = XD::select(['id'])->from(['users'])->where(['id'], '=', 15);
$query = XD::select('*')->from(['tasks'])->where(['user_id'], '=', '(', $select_user_id, ')');
Или так:
$q = XD::select('*')->from(['users']);
$query = $q->limit(100);
// SELECT * FROM `users` LIMIT 100
// или (но не "и", так как произойдет конкатенация с предыдущим действием)
$query = $q->leftJoin(['tasks'])->on(['users.id'], '=', ['tasks.user_id']);
// SELECT * FROM `users` LEFT JOIN `tasks` ON `users`.`id` = `tasks`.`user_id`
Теперь необходимо выполнить этот запрос и получить результат, если он подразумевается. Для запросов с возвращением данных существуют следующие методы:
$result = $query->getSelectOne(); // Получение одной строки в именованный массив.
$result = $query->getSelectValue(); // Получение одного значения.
$result = $query->getSelect(); // Возвращает массив строк в виде именованных массивов.
$result = $query->getSelectAll(); // Возвращает массив из объектов, значения которых можно получить по полям объектов.
$result = $query->toString(); // Возвращает текущую строку запроса (без параметров).
$query = XD::selectCount('(*)')->from(['users'])->where(['name'])->like(['copy[_]%'])->getSelectValue();
// SELECT COUNT(*) FROM `users` WHERE `name` LIKE 'copy[_]%'
Для всех остальных запросов, не возвращающих результирующий набор, достаточно добавить
run(), чтобы выполнить запрос. Любой запрос, в котором вместо исполняющего метода использован
toString(), вернёт строковое представление текущего запроса.
XD::update(['users'])->set(['name'], '=', 'admin')->where(['id'], '=', 1)->run();
XD::dropTable(['users'])->run(); // Удаление таблицы `users`.
В исключительных случаях можно использовать для запросов метод
execute(), возвращающий объект
PDOStatement, и производить
дальнейшие действия с последним согласно документации
PDO.
Использование нескольких соединений
Подключение конфигурационного файла описано в разделе данной инструкции «
Настройка».
Конфигурационный файл может содержать различные варианты соединений с базами данных, по умолчанию используется заданное имя подключения
из константы
HLEB_TYPE_DB. Чтобы выполнить запрос к любой из указанных в конфигурационном файле баз данных, необходимо указать её название
в используемом методе выполнения запроса. Например
run('postgresql.first'),
getSelectOne('postgresql.second') или
getSelect('mysql.name').
Запрос будет выполнен с указанными настройками.
Необязательная константа
HLEB_DB_DISABLE_REVERSE_QUOTES отключает установку обратных слешей (`) в табличных именованиях.
Миграции
Для миграций можно использовать библиотеку
github.com/phphleb/migration.