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

@@ -174,8 +174,6 @@
$conditionItems[] = self::ParseCondition($key, [$condition]);
}
//var_dump($conditionItems);
// Возвращаем группу условий
return new ConditionGroup($operator, $conditionItems);
}

View File

@@ -31,9 +31,9 @@
public string $FieldName;
/**
* @var DataBaseHeadItem $Column Информация об ячейке.
* @var DataBaseColumn $Column Информация об ячейке.
*/
public DataBaseHeadItem $Column;
public DataBaseColumn $Column;
/**
* @var bool $IsIgnored Признак того, что свойство игнорируется при сохранении в / загрузке из БД.
@@ -61,14 +61,14 @@
* @param string $name Имя свойства.
* @param mixed|null $value Значение свойства (ещё не конвертированное!).
* @param string $fieldName Имя поля в таблице БД.
* @param DataBaseHeadItem $column Информация об ячейке.
* @param DataBaseColumn $column Информация об ячейке.
* @param bool $isIgnored Признак того, что свойство игнорируется при сохранении в / загрузке из БД.
* @param callable|null $ConvertToDB Конвертер значения свойства в значение поля БД.
* @param Closure|null $ConvertFromDB Конвертер значения поля БД в значение свойства.
* @param Closure|null $Compare Функция сравнения значений свойства.
*/
public function __construct (string $name = '', mixed $value = null, string $fieldName = '',
DataBaseHeadItem $column = new DataBaseHeadItem(), bool $isIgnored = false, ?callable $ConvertToDB = null,
DataBaseColumn $column = new DataBaseColumn(), bool $isIgnored = false, ?callable $ConvertToDB = null,
?Closure $ConvertFromDB = null, ?Closure $Compare = null)
{
// Установка значений

View File

@@ -13,7 +13,7 @@
* @version 1.0
* @since 1.0
*/
final class DataBaseHeadItem
final class DataBaseColumn
{
/**
* @var string $Name Имя колонки.

View File

@@ -1,29 +0,0 @@
<?php
namespace goodboyalex\php_db_components_pack\classes;
use goodboyalex\php_components_pack\classes\ObjectArray;
/**
* Класс, описывающий структуру столбцов базы данных.
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @since 1.0
*/
final class DataBaseHeader
{
/**
* @var ObjectArray $Container Столбцы таблицы.
*/
private ObjectArray $Container;
/**
* Конструктор.
*/
public function __construct ()
{
$this->Container = new ObjectArray();
}
}

View File

@@ -5,7 +5,10 @@
namespace goodboyalex\php_db_components_pack\classes\tm_drivers;
use goodboyalex\php_db_components_pack\classes\DataBaseHeader;
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_db_components_pack\classes\DataBaseColumn;
use goodboyalex\php_db_components_pack\enums\DBDriver;
use goodboyalex\php_db_components_pack\enums\DBType;
use goodboyalex\php_db_components_pack\interfaces\ITableManager;
use PDO;
@@ -19,6 +22,20 @@
*/
final class MSSQLTableManager implements ITableManager
{
/**
* @var array $TypeConversation Массив типов.
*/
public array $TypeConversation {
get => [
DBType::INT->name => 'INT',
DBType::FLOAT->name => 'DECIMAL(p,s)',
DBType::STRING->name => 'NVARCHAR',
DBType::BOOL->name => 'BIT',
DBType::DATE->name => 'DATETIME',
DBType::ARRAY->name => 'XML'
];
}
/**
* @inheritDoc
*/
@@ -37,16 +54,104 @@
return $stmt->fetchColumn() === '1';
}
public function CreateTable (PDO $handle, string $tableName, DataBaseHeader $columns): bool
/**
* @inheritDoc
*/
public function CreateTable (PDO $handle, string $tableName, ObjectArray $columns): bool
{
// TODO: Implement CreateTable() method.
// Если таблица $tableName уже существует
if ($this->IsTableExist($handle, $tableName))
// - то прерываю
return false;
return false;
// Создаю массив столбцов
$colArray = [];
// Для каждого переданного столбца
foreach ($columns as $column)
// - конвертирую его в строку и добавляю в массив
$colArray[] = $this->ParseColumn($column);
// Конвертирую массив столбцов в строку
$columnsStr = implode(', ', $colArray);
// Создаю SQL запрос
$sql = "CREATE TABLE [$tableName] ($columnsStr)";
// Подготавливаю запрос
$stmt = $handle->prepare($sql);
// Выполняю запрос
$stmt->execute();
// Возвращаю, существует ли теперь таблица
return $this->IsTableExist($handle, $tableName);
}
public function DropTable (PDO $handle, string $tableName): bool
/**
* @inheritDoc
*/
public function ParseColumn (DataBaseColumn $column): string
{
// TODO: Implement DropTable() method.
return false;
// Получаю тип данных
$dbType = $column->Type->Get(0);
// Получаю размер типа данных
$dbTypeSize = $column->Type->Get(1) ?? 0;
// Получаю SQL тип данных
$type = DBType::ToSQLType(DBDriver::MySQL, $dbType);
// Если тип данных - строка
if ($dbType == DBType::STRING)
// - то добавляю размер
$type .= '(' . ($dbTypeSize == 0 ? 'MAX' : $dbTypeSize) . ')';
// Формирую начало результата
$result = "[$column->Name] $type";
// Если должно быть ненулевое значение
if ($column->IsNotNull)
// - то добавляю NOT NULL
$result .= ' NOT NULL';
// Если должно быть уникальное значение
if ($column->IsUnique)
// - то добавляю UNIQUE
$result .= ' UNIQUE';
// Если это первичный ключ
if ($column->IsPrimaryKey)
// - то добавляю PRIMARY KEY
$result .= ' PRIMARY KEY';
// Получаю связанную таблицу
$fkDefinitionTable = $column->ForeignWith->Get(0);
// - и столбец в ней
$fkDefinitionKey = $column->ForeignWith->Get(1);
// Если связанная таблица и столбец определены
if (!($fkDefinitionTable == null || $fkDefinitionKey == null))
// - то добавляю REFERENCES
$result .= " REFERENCES $fkDefinitionTable($fkDefinitionKey)";
// Если заданы проверки
if ($column->Check->Count() > 0)
// - то добавляю CHECK
$result .= " CHECK({$column->Check->Build()})";
// Если задано значение по умолчанию
if ($column->Default != null)
// - то добавляю DEFAULT
$result .= " DEFAULT '$column->Default'";
// Если это поле AutoIncrement
if ($column->IsAutoIncrement)
// - то добавляю AUTO_INCREMENT
$result .= ' IDENTITY(1,1)';
// Вывожу результат
return $result;
}
}

View File

@@ -5,7 +5,10 @@
namespace goodboyalex\php_db_components_pack\classes\tm_drivers;
use goodboyalex\php_db_components_pack\classes\DataBaseHeader;
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_db_components_pack\classes\DataBaseColumn;
use goodboyalex\php_db_components_pack\enums\DBDriver;
use goodboyalex\php_db_components_pack\enums\DBType;
use goodboyalex\php_db_components_pack\interfaces\ITableManager;
use PDO;
@@ -19,6 +22,20 @@
*/
final class MySQLTableManager implements ITableManager
{
/**
* @var array $TypeConversation Массив типов.
*/
public array $TypeConversation {
get => [
DBType::INT->name => 'INT',
DBType::FLOAT->name => 'DECIMAL',
DBType::STRING->name => 'VARCHAR',
DBType::BOOL->name => 'BOOLEAN',
DBType::DATE->name => 'TIMESTAMP',
DBType::ARRAY->name => 'JSON'
];
}
/**
* @inheritDoc
*/
@@ -38,16 +55,103 @@
return $stmt->fetchColumn() > 0;
}
public function CreateTable (PDO $handle, string $tableName, DataBaseHeader $columns): bool
/**
* @inheritDoc
*/
public function CreateTable (PDO $handle, string $tableName, ObjectArray $columns): bool
{
// TODO: Implement CreateTable() method.
// Если таблица $tableName уже существует
if ($this->IsTableExist($handle, $tableName))
// - то прерываю
return false;
return false;
// Создаю массив столбцов
$colArray = [];
// Для каждого переданного столбца
foreach ($columns as $column)
// - конвертирую его в строку и добавляю в массив
$colArray[] = $this->ParseColumn($column);
// Конвертирую массив столбцов в строку
$columnsStr = implode(', ', $colArray);
// Создаю SQL запрос
$sql = "CREATE TABLE `$tableName` ($columnsStr)";
// Подготавливаю запрос
$stmt = $handle->prepare($sql);
// Выполняю запрос
$stmt->execute();
// Возвращаю, существует ли теперь таблица
return $this->IsTableExist($handle, $tableName);
}
public function DropTable (PDO $handle, string $tableName): bool
/**
* @inheritDoc
*/
public function ParseColumn (DataBaseColumn $column): string
{
// TODO: Implement DropTable() method.
return false;
// Получаю тип данных
$dbType = $column->Type->Get(0);
// Получаю размер типа данных
$dbTypeSize = $column->Type->Get(1) ?? 0;
// Получаю SQL тип данных
$type = DBType::ToSQLType(DBDriver::MySQL, $dbType);
// Если тип данных - строка
if ($dbType == DBType::STRING)
// - то добавляю размер
$type .= '(' . ($dbTypeSize == 0 ? 'MAX' : $dbTypeSize) . ')';
// Формирую начало результата
$result = "`$column->Name` $type";
// Если должно быть ненулевое значение
if ($column->IsNotNull)
// - то добавляю NOT NULL
$result .= ' NOT NULL';
// Если должно быть уникальное значение
if ($column->IsUnique)
// - то добавляю UNIQUE
$result .= ' UNIQUE';
// Если это первичный ключ
if ($column->IsPrimaryKey)
// - то добавляю PRIMARY KEY
$result .= ' PRIMARY KEY';
// Получаю связанную таблицу
$fkDefinitionTable = $column->ForeignWith->Get(0);
// - и столбец в ней
$fkDefinitionKey = $column->ForeignWith->Get(1);
// Если связанная таблица и столбец определены
if (!($fkDefinitionTable == null || $fkDefinitionKey == null))
// - то добавляю REFERENCES
$result .= " REFERENCES $fkDefinitionTable($fkDefinitionKey)";
// Если заданы проверки
if ($column->Check->Count() > 0)
// - то добавляю CHECK
$result .= " CHECK({$column->Check->Build()})";
// Если задано значение по умолчанию
if ($column->Default != null)
// - то добавляю DEFAULT
$result .= " DEFAULT '$column->Default'";
// Если это поле AutoIncrement
if ($column->IsAutoIncrement)
// - то добавляю AUTO_INCREMENT
$result .= ' AUTO_INCREMENT';
// Вывожу результат
return $result;
}
}

View File

@@ -5,9 +5,13 @@
namespace goodboyalex\php_db_components_pack\classes\tm_drivers;
use goodboyalex\php_db_components_pack\classes\DataBaseHeader;
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_db_components_pack\classes\DataBaseColumn;
use goodboyalex\php_db_components_pack\enums\DBDriver;
use goodboyalex\php_db_components_pack\enums\DBType;
use goodboyalex\php_db_components_pack\interfaces\ITableManager;
use PDO;
use PDOException;
/**
* Система менеджмента таблицами базы данных Oracle DB.
@@ -19,6 +23,20 @@
*/
final class OracleDBTableManager implements ITableManager
{
/**
* @var array $TypeConversation Массив типов.
*/
public array $TypeConversation {
get => [
DBType::INT->name => 'NUMBER',
DBType::FLOAT->name => 'FLOAT',
DBType::STRING->name => 'NVARCHAR2',
DBType::BOOL->name => 'NUMBER(1)',
DBType::DATE->name => 'DATE',
DBType::ARRAY->name => 'CLOB'
];
}
/**
* @inheritDoc
*/
@@ -37,16 +55,109 @@
return $stmt->fetchColumn() > 0;
}
public function CreateTable (PDO $handle, string $tableName, DataBaseHeader $columns): bool
/**
* @inheritDoc
*/
public function CreateTable (PDO $handle, string $tableName, ObjectArray $columns): bool
{
// TODO: Implement CreateTable() method.
// Если таблица $tableName уже существует
if ($this->IsTableExist($handle, $tableName))
// - то прерываю
return false;
return false;
// Создаю массив столбцов
$colArray = [];
// Для каждого переданного столбца
foreach ($columns as $column)
// - конвертирую его в строку и добавляю в массив
$colArray[] = $this->ParseColumn($column);
// Конвертирую массив столбцов в строку
$columnsStr = implode(', ', $colArray);
// Создаю SQL запрос
$sql = "CREATE TABLE \"$tableName\" ($columnsStr)";
try {
// Подготавливаю запрос
$stmt = $handle->prepare($sql);
// Выполняю запрос
$stmt->execute();
// Возвращаю, существует ли теперь таблица
return $this->IsTableExist($handle, $tableName);
}
catch (PDOException) {
// - в случае ошибки вывожу FALSE
return false;
}
}
public function DropTable (PDO $handle, string $tableName): bool
/**
* @inheritDoc
*/
public function ParseColumn (DataBaseColumn $column): string
{
// TODO: Implement DropTable() method.
return false;
// Получаю тип данных
$dbType = $column->Type->Get(0);
// Получаю размер типа данных
$dbTypeSize = $column->Type->Get(1) ?? 0;
// Получаю SQL тип данных
$type = DBType::ToSQLType(DBDriver::MySQL, $dbType);
// Если тип данных - строка
if ($dbType == DBType::STRING)
// - то добавляю размер
$type .= '(' . ($dbTypeSize == 0 ? 'MAX' : $dbTypeSize) . ')';
// Формирую начало результата
$result = "$column->Name $type";
// Если должно быть ненулевое значение
if ($column->IsNotNull)
// - то добавляю NOT NULL
$result .= ' NOT NULL';
// Если должно быть уникальное значение
if ($column->IsUnique)
// - то добавляю UNIQUE
$result .= ' UNIQUE';
// Если это первичный ключ
if ($column->IsPrimaryKey)
// - то добавляю PRIMARY KEY
$result .= ' PRIMARY KEY';
// Получаю связанную таблицу
$fkDefinitionTable = $column->ForeignWith->Get(0);
// - и столбец в ней
$fkDefinitionKey = $column->ForeignWith->Get(1);
// Если связанная таблица и столбец определены
if (!($fkDefinitionTable == null || $fkDefinitionKey == null))
// - то добавляю REFERENCES
$result .= " REFERENCES $fkDefinitionTable($fkDefinitionKey)";
// Если заданы проверки
if ($column->Check->Count() > 0)
// - то добавляю CHECK
$result .= " CHECK({$column->Check->Build()})";
// Если задано значение по умолчанию
if ($column->Default != null)
// - то добавляю DEFAULT
$result .= " DEFAULT '$column->Default'";
// Если это поле AutoIncrement
if ($column->IsAutoIncrement)
// - то добавляю AUTO_INCREMENT
$result .= ' GENERATED BY DEFAULT AS IDENTITY';
// Вывожу результат
return $result;
}
}

View File

@@ -5,9 +5,13 @@
namespace goodboyalex\php_db_components_pack\classes\tm_drivers;
use goodboyalex\php_db_components_pack\classes\DataBaseHeader;
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_db_components_pack\classes\DataBaseColumn;
use goodboyalex\php_db_components_pack\enums\DBDriver;
use goodboyalex\php_db_components_pack\enums\DBType;
use goodboyalex\php_db_components_pack\interfaces\ITableManager;
use PDO;
use PDOException;
/**
* Система менеджмента таблицами базы данных PostgreSQL.
@@ -19,6 +23,20 @@
*/
final class PostgreSQLTableManager implements ITableManager
{
/**
* @var array $TypeConversation Массив типов.
*/
public array $TypeConversation {
get => [
DBType::INT->name => 'INTEGER',
DBType::FLOAT->name => 'NUMERIC',
DBType::STRING->name => 'TEXT',
DBType::BOOL->name => 'BOOL',
DBType::DATE->name => 'TIMESTAMPTZ',
DBType::ARRAY->name => 'JSONB'
];
}
/**
* @inheritDoc
*/
@@ -41,16 +59,109 @@
return $stmt->fetchColumn() === 'true';
}
public function CreateTable (PDO $handle, string $tableName, DataBaseHeader $columns): bool
/**
* @inheritDoc
*/
public function CreateTable (PDO $handle, string $tableName, ObjectArray $columns): bool
{
// TODO: Implement CreateTable() method.
// Если таблица $tableName уже существует
if ($this->IsTableExist($handle, $tableName))
// - то прерываю
return false;
return false;
// Создаю массив столбцов
$colArray = [];
// Для каждого переданного столбца
foreach ($columns as $column)
// - конвертирую его в строку и добавляю в массив
$colArray[] = $this->ParseColumn($column);
// Конвертирую массив столбцов в строку
$columnsStr = implode(', ', $colArray);
// Создаю SQL запрос
$sql = "CREATE TABLE \"$tableName\" ($columnsStr)";
try {
// Подготавливаю запрос
$stmt = $handle->prepare($sql);
// Выполняю запрос
$stmt->execute();
// Возвращаю, существует ли теперь таблица
return $this->IsTableExist($handle, $tableName);
}
catch (PDOException) {
// - в случае ошибки вывожу FALSE
return false;
}
}
public function DropTable (PDO $handle, string $tableName): bool
/**
* @inheritDoc
*/
public function ParseColumn (DataBaseColumn $column): string
{
// TODO: Implement DropTable() method.
return false;
// Получаю тип данных
$dbType = $column->Type->Get(0);
// Получаю размер типа данных
$dbTypeSize = $column->Type->Get(1) ?? 0;
// Получаю SQL тип данных
$type = DBType::ToSQLType(DBDriver::MySQL, $dbType);
// Если тип данных - строка
if ($dbType == DBType::STRING)
// - то добавляю размер
$type .= '(' . ($dbTypeSize == 0 ? 'MAX' : $dbTypeSize) . ')';
// Формирую начало результата
$result = "\"$column->Name\" $type";
// Если должно быть ненулевое значение
if ($column->IsNotNull)
// - то добавляю NOT NULL
$result .= ' NOT NULL';
// Если должно быть уникальное значение
if ($column->IsUnique)
// - то добавляю UNIQUE
$result .= ' UNIQUE';
// Если это первичный ключ
if ($column->IsPrimaryKey)
// - то добавляю PRIMARY KEY
$result .= ' PRIMARY KEY';
// Получаю связанную таблицу
$fkDefinitionTable = $column->ForeignWith->Get(0);
// - и столбец в ней
$fkDefinitionKey = $column->ForeignWith->Get(1);
// Если связанная таблица и столбец определены
if (!($fkDefinitionTable == null || $fkDefinitionKey == null))
// - то добавляю REFERENCES
$result .= " REFERENCES \"$fkDefinitionTable\"(\"$fkDefinitionKey\")";
// Если заданы проверки
if ($column->Check->Count() > 0)
// - то добавляю CHECK
$result .= " CHECK({$column->Check->Build()})";
// Если задано значение по умолчанию
if ($column->Default != null)
// - то добавляю DEFAULT
$result .= " DEFAULT '$column->Default'";
// Если это поле AutoIncrement
if ($column->IsAutoIncrement)
// - то добавляю AUTO_INCREMENT
$result .= ' SERIAL';
// Вывожу результат
return $result;
}
}

View File

@@ -5,9 +5,13 @@
namespace goodboyalex\php_db_components_pack\classes\tm_drivers;
use goodboyalex\php_db_components_pack\classes\DataBaseHeader;
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_db_components_pack\classes\DataBaseColumn;
use goodboyalex\php_db_components_pack\enums\DBDriver;
use goodboyalex\php_db_components_pack\enums\DBType;
use goodboyalex\php_db_components_pack\interfaces\ITableManager;
use PDO;
use PDOException;
/**
* Система менеджмента таблицами базы данных SQLite.
@@ -19,6 +23,20 @@
*/
final class SQLiteTableManager implements ITableManager
{
/**
* @var array $TypeConversation Массив типов.
*/
public array $TypeConversation {
get => [
DBType::INT->name => 'INTEGER',
DBType::FLOAT->name => 'REAL',
DBType::STRING->name => 'TEXT',
DBType::BOOL->name => 'BOOLEAN',
DBType::DATE->name => 'DATETIME',
DBType::ARRAY->name => 'TEXT'
];
}
/**
* @inheritDoc
*/
@@ -37,16 +55,99 @@
return $stmt->fetchColumn() > 0;
}
public function CreateTable (PDO $handle, string $tableName, DataBaseHeader $columns): bool
/**
* @inheritDoc
*/
public function CreateTable (PDO $handle, string $tableName, ObjectArray $columns): bool
{
// TODO: Implement CreateTable() method.
// Если таблица $tableName уже существует
if ($this->IsTableExist($handle, $tableName))
// - то прерываю
return false;
return false;
// Создаю массив столбцов
$colArray = [];
// Для каждого переданного столбца
foreach ($columns as $column)
// - конвертирую его в строку и добавляю в массив
$colArray[] = $this->ParseColumn($column);
// Конвертирую массив столбцов в строку
$columnsStr = implode(', ', $colArray);
// Создаю SQL запрос
$sql = "CREATE TABLE IF NOT EXISTS \"$tableName\" ($columnsStr)";
try {
// Подготавливаю запрос
$stmt = $handle->prepare($sql);
// Выполняю запрос
$stmt->execute();
// Возвращаю, существует ли теперь таблица
return $this->IsTableExist($handle, $tableName);
}
catch (PDOException) {
// - в случае ошибки вывожу FALSE
return false;
}
}
public function DropTable (PDO $handle, string $tableName): bool
/**
* @inheritDoc
*/
public function ParseColumn (DataBaseColumn $column): string
{
// TODO: Implement DropTable() method.
return false;
// Получаю тип данных
$dbType = $column->Type->Get(0);
// Получаю размер типа данных
$dbTypeSize = $column->Type->Get(1) ?? 0;
// Получаю SQL тип данных
$type = DBType::ToSQLType(DBDriver::MySQL, $dbType);
// Если тип данных - строка
if ($dbType == DBType::STRING)
// - то добавляю размер
$type .= '(' . ($dbTypeSize == 0 ? 'MAX' : $dbTypeSize) . ')';
// Формирую начало результата
$result = "$column->Name $type";
// Если должно быть ненулевое значение
if ($column->IsNotNull)
// - то добавляю NOT NULL
$result .= ' NOT NULL';
// Если должно быть уникальное значение
if ($column->IsUnique)
// - то добавляю UNIQUE
$result .= ' UNIQUE';
// Если это первичный ключ
if ($column->IsPrimaryKey)
// - то добавляю PRIMARY KEY
$result .= ' PRIMARY KEY';
// Если заданы проверки
if ($column->Check->Count() > 0)
// - то добавляю CHECK
$result .= " CHECK({$column->Check->Build()})";
// Если задано значение по умолчанию
if ($column->Default != null)
// - то добавляю DEFAULT
$result .= " DEFAULT '$column->Default'";
// Если это поле AutoIncrement
if ($column->IsAutoIncrement)
// - то добавляю AUTO_INCREMENT
$result .= ' AUTOINCREMENT';
// Вывожу результат
return $result;
}
}

View File

@@ -42,4 +42,14 @@
* Операция подсчета количества.
*/
case Count = 4;
/**
* Операция создания таблицы в базе данных.
*/
case CreateTable = 5;
/**
* Операция удаления таблицы в базе данных.
*/
case DropTable = 6;
}

View File

@@ -3,6 +3,11 @@
namespace goodboyalex\php_db_components_pack\enums;
use goodboyalex\php_components_pack\traits\EnumExtensionsTrait;
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;
/**
* Перечисление типов в БД.
@@ -46,4 +51,27 @@
* Массив/объект.
*/
case ARRAY = 5;
/**
* Переводит значение из типа DBType в тип, пригодный в СУБД.
*
* @param DBDriver $driver Тип драйвера СУБД.
* @param DBType $value Тип данных.
*
* @return string SQL-тип.
*/
public static function ToSQLType (DBDriver $driver, DBType $value): string
{
// Получаю систему управления таблицами БД
$dbDrv = match ($driver) {
DBDriver::MySQL => new MySQLTableManager(),
DBDriver::MSSQL => new MSSQLTableManager(),
DBDriver::PostgreSQL => new PostgreSQLTableManager(),
DBDriver::OracleDB => new OracleDBTableManager(),
DBDriver::SQLite => new SQLiteTableManager()
};
// Получаю тип
return $dbDrv->TypeConversation[$value->GetValue()];
}
}

View File

@@ -2,7 +2,8 @@
namespace goodboyalex\php_db_components_pack\interfaces;
use goodboyalex\php_db_components_pack\classes\DataBaseHeader;
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_db_components_pack\classes\DataBaseColumn;
use PDO;
/**
@@ -15,6 +16,13 @@
*/
interface ITableManager
{
/**
* @var array $TypeConversation Таблица соответствий типов данных PHP и соответствующего драйвера СУБД.
*/
public array $TypeConversation {
get;
}
/**
* Проверяет существование таблицы в базе данных.
*
@@ -30,19 +38,18 @@
*
* @param PDO $handle Представляет соединение между PHP и сервером базы данных.
* @param string $tableName Имя таблицы.
* @param DataBaseHeader $columns Колонки таблицы.
* @param ObjectArray $columns Колонки таблицы.
*
* @return bool Возвращает <code>true</code>, если таблица успешно создана, иначе возвращает <code>false</code>.
*/
public function CreateTable (PDO $handle, string $tableName, DataBaseHeader $columns): bool;
public function CreateTable (PDO $handle, string $tableName, ObjectArray $columns): bool;
/**
* Удаляет таблицу из базы данных.
* Разбирает столбец для SQL-запроса создания.
*
* @param PDO $handle Представляет соединение между PHP и сервером базы данных.
* @param string $tableName Имя таблицы.
* @param DataBaseColumn $column Столбец таблицы.
*
* @return bool Возвращает <code>true</code>, если таблица успешно удалена, иначе возвращает <code>false</code>.
* @return string SQL-представление столбца.
*/
public function DropTable (PDO $handle, string $tableName): bool;
public function ParseColumn (DataBaseColumn $column): string;
}

View File

@@ -10,7 +10,7 @@
* Модель параметров базы данных.
*
* @author Александр Бабаев
* @package php_components_pack
* @package php_db_components_pack
* @version 1.0
* @since 1.0
*/

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();