parent
254cc88a42
commit
01d0138f43
@ -0,0 +1,88 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
declare(strict_types=1); |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Robert Strutts |
||||||
|
* @copyright (c) 2026, Robert Strutts |
||||||
|
* @license MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
namespace IOcornerstone\Framework\Database; |
||||||
|
|
||||||
|
/** |
||||||
|
* Description of BuildSQL |
||||||
|
* |
||||||
|
* @author Robert Strutts |
||||||
|
*/ |
||||||
|
class BuildSQL |
||||||
|
{ |
||||||
|
|
||||||
|
/** |
||||||
|
* Generate CREATE TABLE SQL from an existing MySQL table. |
||||||
|
*/ |
||||||
|
public function generateCreateTable(\PDO $pdo, string $table): string |
||||||
|
{ |
||||||
|
$sql = " |
||||||
|
SELECT |
||||||
|
COLUMN_NAME, |
||||||
|
COLUMN_TYPE, |
||||||
|
IS_NULLABLE, |
||||||
|
COLUMN_DEFAULT, |
||||||
|
EXTRA, |
||||||
|
COLUMN_KEY, |
||||||
|
COLUMN_COMMENT |
||||||
|
FROM INFORMATION_SCHEMA.COLUMNS |
||||||
|
WHERE TABLE_SCHEMA = DATABASE() |
||||||
|
AND TABLE_NAME = ? |
||||||
|
ORDER BY ORDINAL_POSITION |
||||||
|
"; |
||||||
|
|
||||||
|
$stmt = $pdo->prepare($sql); |
||||||
|
$stmt->execute([$table]); |
||||||
|
|
||||||
|
$columns = []; |
||||||
|
$primary = []; |
||||||
|
|
||||||
|
while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { |
||||||
|
$line = '`' . $row['COLUMN_NAME'] . '` ' . $row['COLUMN_TYPE']; |
||||||
|
|
||||||
|
if ($row['IS_NULLABLE'] === 'NO') { |
||||||
|
$line .= ' NOT NULL'; |
||||||
|
} |
||||||
|
|
||||||
|
if ($row['COLUMN_DEFAULT'] !== null) { |
||||||
|
$default = $row['COLUMN_DEFAULT']; |
||||||
|
|
||||||
|
if (strtoupper($default) === 'CURRENT_TIMESTAMP') { |
||||||
|
$line .= ' DEFAULT CURRENT_TIMESTAMP'; |
||||||
|
} else { |
||||||
|
$line .= ' DEFAULT ' . $pdo->quote($default); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!empty($row['EXTRA'])) { |
||||||
|
$line .= ' ' . strtoupper($row['EXTRA']); |
||||||
|
} |
||||||
|
|
||||||
|
if (!empty($row['COLUMN_COMMENT'])) { |
||||||
|
$line .= ' COMMENT ' . $pdo->quote($row['COLUMN_COMMENT']); |
||||||
|
} |
||||||
|
|
||||||
|
$columns[] = $line; |
||||||
|
|
||||||
|
if ($row['COLUMN_KEY'] === 'PRI') { |
||||||
|
$primary[] = '`' . $row['COLUMN_NAME'] . '`'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!empty($primary)) { |
||||||
|
$columns[] = 'PRIMARY KEY (' . implode(', ', $primary) . ')'; |
||||||
|
} |
||||||
|
|
||||||
|
return "CREATE TABLE IF NOT EXISTS `{$table}` (\n " |
||||||
|
. implode(",\n ", $columns) |
||||||
|
. "\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
Loading…
Reference in new issue