This commit is contained in:
2025-08-05 18:33:19 +03:00
parent 06d92863ee
commit 3161fcf4dd
21 changed files with 1449 additions and 83 deletions

View File

@@ -21,7 +21,7 @@
use goodboyalex\php_db_components_pack\attributes\PrimaryKey;
use goodboyalex\php_db_components_pack\attributes\Unique;
use goodboyalex\php_db_components_pack\classes\ConditionBuilder;
use goodboyalex\php_db_components_pack\classes\DataBaseHeadItem;
use goodboyalex\php_db_components_pack\classes\DataBaseColumn;
use goodboyalex\php_db_components_pack\classes\DBItemProperty;
use goodboyalex\php_db_components_pack\enums\DBOperation;
use goodboyalex\php_db_components_pack\enums\DBType;
@@ -219,7 +219,7 @@
$isAutoIncrement = $aiAttr !== null;
// - создаю заголовок
$columnHeader = new DataBaseHeadItem($fieldName, $dataType, $isNotNull, $isUnique, $isPrimary,
$columnHeader = new DataBaseColumn($fieldName, $dataType, $isNotNull, $isUnique, $isPrimary,
$foreignWith, $checkFunc, $default, $isAutoIncrement);

View File

@@ -6,12 +6,17 @@
namespace goodboyalex\php_db_components_pack\traits\Database;
use Exception;
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_db_components_pack\classes\DBItemProperty;
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 PDO;
/**
@@ -46,4 +51,124 @@
// Проверяю существование таблицы, вывожу результат
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);
}
}

View File

@@ -37,7 +37,7 @@
$properties = self::GetProperties($item, DBOperation::Update);
// Получаю первичные ключи объекта
$primaryKeys = $properties->GetRows(fn (DBItemProperty $property): bool => $property->IsPrimaryKey);
$primaryKeys = $properties->GetRows(fn (DBItemProperty $property): bool => $property->Column->IsPrimaryKey);
// Создаю условие по первичным ключам (оно же и WHERE для обновления)
$where = new ConditionBuilder();