php_db_components_pack/sources/traits/Database/DatabaseTableManagement.php
2025-08-07 18:06:55 +03:00

174 lines
7.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* @noinspection SqlNoDataSourceInspection
*/
namespace goodboyalex\php_db_components_pack\traits\Database;
use Exception;
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_db_components_pack\classes\tm_drivers\MSSQLTableManager;
use goodboyalex\php_db_components_pack\classes\tm_drivers\MySQLTableManager;
use goodboyalex\php_db_components_pack\classes\tm_drivers\OracleDBTableManager;
use goodboyalex\php_db_components_pack\classes\tm_drivers\PostgreSQLTableManager;
use goodboyalex\php_db_components_pack\classes\tm_drivers\SQLiteTableManager;
use goodboyalex\php_db_components_pack\enums\DBDriver;
use goodboyalex\php_db_components_pack\enums\DBOperation;
use goodboyalex\php_db_components_pack\interfaces\IDBItem;
use goodboyalex\php_db_components_pack\models\DBItemProperty;
use PDO;
/**
* Трейт для управления таблицами базы данных.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.0
* @see PDO
*/
trait DatabaseTableManagement
{
/**
* Проверяет, существует ли таблица.
*
* @param string $tableName Имя таблицы.
*
* @return bool Результат проверки: <code>true</code> - таблица существует, <code>false</code> - не существует.
*/
public function IsTableExist (string $tableName): bool
{
// Получаю систему управления таблицами БД
$dbDrv = match ($this->Config->Driver) {
DBDriver::MySQL => new MySQLTableManager(),
DBDriver::MSSQL => new MSSQLTableManager(),
DBDriver::PostgreSQL => new PostgreSQLTableManager(),
DBDriver::OracleDB => new OracleDBTableManager(),
DBDriver::SQLite => new SQLiteTableManager()
};
// Проверяю существование таблицы, вывожу результат
return $dbDrv->isTableExist($this->DataBaseHandle, $tableName);
}
/**
* Создаёт новую таблицу.
*
* @param string $tableName Имя таблицы.
* @param string $dbItemClass Класс моделей, которых будет представлять эта таблица.
*
* @return bool Результат создания: <code>true</code>, если таблица создана и <code>false</code>, если
* произошла ошибка.
*/
public function CreateTable (string $tableName, string $dbItemClass): bool
{
// Создаю экземпляр класса
$instance = new $dbItemClass();
// Проверяю, что он реализует интерфейс IDBItem
if (!$instance instanceof IDBItem)
// - если нет, ошибка
return false;
// Получаю свойства класса
$properties = self::GetProperties($instance, DBOperation::CreateTable);
// Создаю массив столбцов
$columns = new ObjectArray();
/**
* Для каждого свойства...
*
* @var DBItemProperty $property Свойство.
*/
foreach ($properties as $property)
// - добавляю его столбцы в массив столбцов
$columns->Add($property->Column);
// Получаю систему управления таблицами БД
$dbDrv = match ($this->Config->Driver) {
DBDriver::MySQL => new MySQLTableManager(),
DBDriver::MSSQL => new MSSQLTableManager(),
DBDriver::PostgreSQL => new PostgreSQLTableManager(),
DBDriver::OracleDB => new OracleDBTableManager(),
DBDriver::SQLite => new SQLiteTableManager()
};
try {
// Активирую транзакцию
$this->InitTransaction();
// Создаю таблицу и возвращаю результат
$result = $dbDrv->CreateTable($this->DataBaseHandle, $tableName, $columns);
// Отправляю данные в БД
$this->Commit();
// Возвращаю результат
return $result;
}
catch (Exception $exception) {
// - в случае ошибки, пытаюсь откатиться назад
$this->RollBack();
// - обрабатываю исключение
$this->HandleException($exception, false);
// - возвращаю провал
return false;
}
}
/**
* Удаляет таблицу.
*
* @param string $tableName Имя удаляемой таблицы.
*
* @return bool Результат удаления: <code>true</code> - таблица удалена, <code>false</code> - произошла
* неизвестная ошибка при удалении.
*/
public function DropTable (string $tableName): bool
{
// Если таблицы не существует или она уже удалена
if (!$this->IsTableExist($tableName))
// - то возвращаем true
return true;
// SQL-запрос
$sql = "DROP TABLE dbo.`$tableName`";
// Инициализирую транзакцию
$this->InitTransaction();
// Выполняю SQL-запрос удаления
$result = $this->Execute($sql);
// Если неудачно
if ($result === false) {
// - то откатываю изменения
$this->RollBack();
// - возвращаю провал
return false;
}
try {
// Пытаюсь отправить изменения
$this->Commit();
}
catch (Exception $exception) {
// - в случае ошибки, откатываю изменения
$this->RollBack();
// - описываю ошибку
$this->HandleException($exception, false);
// - возвращаю провал
return false;
}
// Возвращаю, существует ли теперь таблица
return $this->IsTableExist($tableName);
}
}