proceed further with beans
This commit is contained in:
105
Migration.php
105
Migration.php
@@ -1,6 +1,8 @@
|
||||
<?php
|
||||
namespace DatabaseHelper;
|
||||
|
||||
use DatabaseHelper\beans\Column;
|
||||
use DatabaseHelper\beans\Reference;
|
||||
use DatabaseHelper\beans\Schema;
|
||||
use DatabaseHelper\enums\Propagation;
|
||||
use DatabaseHelper\enums\Type;
|
||||
@@ -9,81 +11,76 @@ use InvalidArgumentException;
|
||||
class Migration
|
||||
{
|
||||
protected Schema $schema;
|
||||
protected array $columnsToAdd = [];
|
||||
protected array $columnsToModify = [];
|
||||
protected array $columnsToDrop = [];
|
||||
protected array $foreignKeysToAdd = [];
|
||||
protected array $foreignKeysToDrop = [];
|
||||
protected array $newCols = [];
|
||||
protected array $editCols = [];
|
||||
protected array $dropCols = [];
|
||||
protected array $addRefs = [];
|
||||
protected array $dropRefs = [];
|
||||
|
||||
public function __construct(Schema $table) {
|
||||
$this->schema = $table->copy();
|
||||
$this->schema = $table;
|
||||
}
|
||||
|
||||
public function column(string $name, Type $type, mixed $default = null, bool $isNullable = false, bool $isUnique = false): Migration {
|
||||
if ($this->schema->existsColumn($name))
|
||||
throw new InvalidArgumentException("Column '$name' already exists.");
|
||||
$table = $this->schema->name;
|
||||
if ($this->schema->existsCol($name))
|
||||
throw new InvalidArgumentException("Column '$name' already exists in $table.");
|
||||
|
||||
$this->schema->columns[$name] = [
|
||||
'name' => $name,
|
||||
'type' => $type,
|
||||
'default' => $default,
|
||||
'isNullable' => $isNullable,
|
||||
'isUnique' => $isUnique
|
||||
];
|
||||
$col = new Column;
|
||||
$col->name = $name;
|
||||
$col->type = $type;
|
||||
$col->default = $default;
|
||||
$col->isUnique = $isUnique;
|
||||
$col->isNullable = $isNullable;
|
||||
|
||||
$this->columnsToAdd[] = $name;
|
||||
$this->schema->cols[$name] = $col;
|
||||
$this->newCols[] = $name;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function modify(string $name, Type $type, mixed $default = null, bool $isNullable = false, bool $isUnique = false): Migration {
|
||||
$this->schema->requireColumn($name);
|
||||
if (isset($this->schema->references[$name]))
|
||||
throw new InvalidArgumentException('Referencing columns cannot be modified.');
|
||||
$this->schema->reqCol($name);
|
||||
$col = $this->schema->getCol($name);
|
||||
|
||||
$this->schema->columns[$name] = [
|
||||
'name' => $name,
|
||||
'type' => $type,
|
||||
'default' => $default,
|
||||
'isNullable' => $isNullable,
|
||||
'isUnique' => $isUnique
|
||||
];
|
||||
$col->name = $name;
|
||||
$col->type = $type;
|
||||
$col->default = $default;
|
||||
$col->isNullable = $isNullable;
|
||||
$col->isUnique = $isUnique;#
|
||||
|
||||
$this->columnsToModify[] = $name;
|
||||
$this->editCols[$name] = $col;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function drop(string $name): Migration {
|
||||
$this->schema->requireColumn($name);
|
||||
unset($this->schema->columns[$name]);
|
||||
$this->columnsToDrop[] = $name;
|
||||
unset($this->schema->cols[$name]);
|
||||
$this->dropCols[] = $name;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function reference(Schema $foreignTable, Propagation $onDelete = Propagation::CASCADE, Propagation $onUpdate = Propagation::CASCADE): Migration {
|
||||
$name = $foreignTable->primaryKey();
|
||||
$this->schema->requireColumn($name);
|
||||
if($this->schema->existsRef($foreignTable))
|
||||
throw new InvalidArgumentException("Foreign table '$foreignTable->name' is already referenced in '{$this->schema->name}'.");
|
||||
$name = $foreignTable->id->name;
|
||||
|
||||
$this->schema->references[$name] = [
|
||||
'name' => $name,
|
||||
'table' => $foreignTable->name,
|
||||
'onDelete' => $onDelete,
|
||||
'onUpdate' => $onUpdate
|
||||
];
|
||||
$this->schema->columns[$name] = $foreignTable->columns[$name];
|
||||
$ref = new Reference;
|
||||
$ref->name = $name;
|
||||
$ref->onUpdate = $onUpdate;
|
||||
$ref->onDelete = $onDelete;
|
||||
|
||||
$this->schema->refs[$name] = $ref;
|
||||
$this->addRefs[] = $name;
|
||||
|
||||
$this->foreignKeysToAdd[] = $name;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function dereference(Schema $foreignTable): Migration {
|
||||
$name = $foreignTable->primaryKey();
|
||||
if ($this->schema->existsReference($foreignTable))
|
||||
throw new InvalidArgumentException('Foreign table is not referenced.');
|
||||
$this->schema->reqRef($foreignTable);
|
||||
$name = $foreignTable->id->name;
|
||||
|
||||
unset($this->schema->references[$name]);
|
||||
$this->drop($name);
|
||||
unset($this->schema->refs[$name]);
|
||||
$this->dropRefs[] = $name;
|
||||
|
||||
$this->foreignKeysToDrop[] = $name;
|
||||
return $this;
|
||||
}
|
||||
|
||||
@@ -94,8 +91,8 @@ class Migration
|
||||
$clauses = [];
|
||||
|
||||
// Process new columns.
|
||||
foreach ($this->columnsToAdd as $columnName) {
|
||||
$col = $this->schema->columns[$columnName];
|
||||
foreach ($this->newCols as $columnName) {
|
||||
$col = $this->schema->cols[$columnName];
|
||||
$clause = "ADD COLUMN `{$col['name']}` {$col['type']->toString()}";
|
||||
|
||||
$clause .= !$col['isNullable'] ? " NOT NULL" : "";
|
||||
@@ -110,8 +107,8 @@ class Migration
|
||||
}
|
||||
|
||||
// Process modified columns.
|
||||
foreach ($this->columnsToModify as $columnName) {
|
||||
$col = $this->schema->columns[$columnName];
|
||||
foreach ($this->editCols as $columnName) {
|
||||
$col = $this->schema->cols[$columnName];
|
||||
$clause = "MODIFY COLUMN `{$col['name']}` {$col['type']->toString()}";
|
||||
|
||||
$clause .= !$col['isNullable'] ? " NOT NULL" : "";
|
||||
@@ -127,12 +124,12 @@ class Migration
|
||||
|
||||
|
||||
// Process dropped columns.
|
||||
foreach ($this->columnsToDrop as $columnName)
|
||||
foreach ($this->dropCols as $columnName)
|
||||
$clauses[] = "DROP COLUMN `$columnName`";
|
||||
|
||||
// Process foreign keys to add.
|
||||
foreach ($this->foreignKeysToAdd as $key) {
|
||||
$foreignKey = $this->schema->references[$key];
|
||||
foreach ($this->addRefs as $key) {
|
||||
$foreignKey = $this->schema->refs[$key];
|
||||
|
||||
$clause = " ADD CONSTRAINT `fk_{$foreignKey['name']}`";
|
||||
$clause .= " FOREIGN KEY (`{$foreignKey['name']}`)";
|
||||
@@ -144,7 +141,7 @@ class Migration
|
||||
}
|
||||
|
||||
// Process foreign keys to drop.
|
||||
foreach ($this->foreignKeysToDrop as $fkName)
|
||||
foreach ($this->dropRefs as $fkName)
|
||||
$clauses[] = "DROP FOREIGN KEY `fk_{$fkName}`";
|
||||
|
||||
if (empty($clauses))
|
||||
|
Reference in New Issue
Block a user