remils / database
Менеджер баз данных
Installs: 6
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/remils/database
Requires
- php: ^8.1
Requires (Dev)
- phpstan/phpstan: ^1.10
- squizlabs/php_codesniffer: 3.*
README
Достаточно простой в использовании и легко расширяется для создания адаптеров подключения. В данный момент описаны адаптеры, которые работают с PDO, MySQLi и SQLite3.
Установка в проект
Выполните команду в консоли:
composer require remils/database
Менеджер БД
Инициализируйте класс менеджера в нужном вам месте, либо добавьте его в контейнер зависимостей.
<?php use Remils\Database\Manager; $manager = new Manager();
Методы менеджера:
| Метод | Описание |
|---|---|
| setConnect(string $name, ConnectContract $connect): Manager | Добавляет подключение в менеджер |
| getConnect(string $name): ConnectContract | Возвращает объект подключения из менеджера |
Адаптеры подключения
Доступные адаптеры:
| Пространство имени | Конструктор | Описание |
|---|---|---|
| Remils\Database\MySQLi\Connect | __construct(string $host, ?string $username = null, ?string $password = null, ?string $database = null, ?int $port = null, ?string $socket = null) | Адаптер подключения для MySQLi |
| Remils\Database\PDO\Connect | __construct(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null) | Адаптер подключения для PDO |
| Remils\Database\SQLite3\Connect | __construct(string $filename, int $flags = SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, string $encryptionKey = null) | Адаптер подключения для SQLite3 |
Все адаптеры реализуют интерфейс Remils\Database\Contract\ConnectContract.
Методы интерфейса:
| Метод | Описание |
|---|---|
| customizer(callable $callback): void | Настройка пользователя (Возвращает объект подключения) |
| transaction(Closure $closure): mixed | Вызов транзакции |
| lastInsertId(): mixed | Возвращает ID последней вставленной строки или значение последовательности |
| prepare(string $sql): StatementContract | Подготавливает SQL выражение к выполнению |
| execute(string $sql): ResultContract | Выполняет запрос к базе данных |
Подготовка запроса
Каждый адаптер реализует свою подготовку запроса интерфейса Remils\Database\Contract\StatementContract.
Методы интерфейса:
| Метод | Описание |
|---|---|
| setParameter(string $key, mixed $value, ParameterType $type = ParameterType::STRING): StatementContract | Привязка переменных к параметрам подготавливаемого запроса |
| execute(): ResultContract | Выполняет запрос к базе данных |
Типизация параметров в подготавливаемом запросе
Для преобразования типов в подготовительном запросе используются константы из перечисления Remils\Database\Enum\ParameterType.
| Константа | Описание |
|---|---|
| ParameterType::INTEGER | Преобразование подготовительного выражения в INTEGER |
| ParameterType::FLOAT | Преобразование подготовительного выражения в FLOAT |
| ParameterType::STRING | Преобразование подготовительного выражения в STRING |
| ParameterType::BOOLEAN | Преобразование подготовительного выражения в BOOLEAN |
| ParameterType::BLOB | Преобразование подготовительного выражения в BLOB |
| ParameterType::NULL | Преобразование подготовительного выражения в NULL |
| ParameterType::JSON | Преобразование подготовительного выражения в JSON |
Обработка запроса
После выполнения execute метода, для обработки результатов выполненного запроса используются методы интерфейса Remils\Database\Contract\ResultContract.
Методы интерфейса:
| Метод | Описание |
|---|---|
| fetch(): ?array | Выбирает строку из набора результатов и помещает её в ассоциативный массив |
| fetchObject(string $className = stdClass::class): ?object | Выбирает строку из набора результатов в виде объекта |
| fetchAll(): array | Выбирает все строки из результирующего набора и помещает их в ассоциативный массив |
| fetchAllObject(string $className = stdClass::class): array | Выбирает все строки из результирующего набора и помещает их в объект |
| fetchColumn(int $column = 0): mixed | Получает один столбец из строки набора результатов |
| fetchAllColumn(int $column = 0): array | Получает все строки, в виде массива, содержащие значения столбца |
Репозиторий
Репозитории реализуют интерфейс Remils\Database\Contract\RepositoryContract.
Методы интерфейса:
| Метод | Описание |
|---|---|
| getTableName(): string | Возвращает имя таблицы |
| getEntityClassName(): string | Возвращает имя модели |
| getConnectName(): string | Возвращает имя коннекта |
| getConnect(): ConnectContract | Возвращает подключение |
Для удобства был реализован абстрактный репозиторий, в котором описаны наиболее распространеные методы. Если требуются другие методы, то смело расширяйте свой репозиторий.
Методы абстрактного репозитория:
| Метод | Описание |
|---|---|
| all(): array | Возвращает все записи |
| first(array $credentials = []): ?object | Возвращает первую запись, либо первую подходящую запись по учетным данным |
| paginate(int $offset, int $limit = 15): array | Постраничный вывод записей |
| count(): int | Возвращает количество записей в таблице |
| insert(array $data): object | Вставка записи |
| delete(array $credentials = []): void | Удаляет все записи, либо записи которые удовлетворяют учетным данным |
| update(array $data, array $credentials = []): void | Обновляет записи, либо записи которые удовлетворяют учетным данным |
Пример
<?php use Remils\Database\AbstractRepository; use Remils\Database\Manager; use Remils\Database\PDO\Connect; require 'vendor/autoload.php'; $manager = new Manager(); $manager->setConnect('default', new Connect('sqlite:test.db')); $connect = $manager->getConnect('default'); $connect->execute(<<<SQL CREATE TABLE IF NOT EXISTS `users` ( `id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` VARCHAR(255) ); SQL); class User { private int $id; private string $name; public function getId(): int { return $this->id; } public function getName(): string { return $this->name; } } class UserRepository extends AbstractRepository { public function getConnectName(): string { return 'default'; } public function getTableName(): string { return 'users'; } public function getEntityClassName(): string { return User::class; } } $userRepository = new UserRepository($manager); $user = $userRepository->insert([ 'name' => 'Иван', ]); var_dump($user); $userRepository->update([ 'name' => 'Василий', ], [ 'id' => $user->getId(), ]); $user = $userRepository->first([ 'id' => $user->getId(), ]); var_dump($user); $userRepository->delete([ 'id' => $user->getId(), ]);