[ 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 */ public function IsTableExist (PDO $handle, string $tableName): bool { // Создаю SQL-запрос $sql = "SELECT CASE WHEN OBJECT_ID(:tableName, 'U') IS NOT NULL THEN 1 ELSE 0 END"; // Подготавливаю данные $stmt = $handle->prepare($sql); // Выполняю запрос $stmt->execute(['tableName' => $tableName]); // Получаю количество таблиц и вывожу true или false return $stmt->fetchColumn() === '1'; } /** * @inheritDoc */ public function CreateTable (PDO $handle, string $tableName, ObjectArray $columns): bool { // Если таблица $tableName уже существует if ($this->IsTableExist($handle, $tableName)) // - то прерываю 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); } /** * @inheritDoc */ public function ParseColumn (DataBaseColumn $column): string { // Получаю тип данных $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; } }