Skip to content
Merged
16 changes: 16 additions & 0 deletions src/Database/Constants/ColumnAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

namespace Phenix\Database\Constants;

enum ColumnAction: string
{
case SET_NULL = 'SET_NULL';

case NO_ACTION = 'NO_ACTION';

case CASCADE = 'CASCADE';

case RESTRICT = 'RESTRICT';
}
55 changes: 2 additions & 53 deletions src/Database/Migrations/Columns/Column.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,11 @@

namespace Phenix\Database\Migrations\Columns;

use Phinx\Db\Adapter\AdapterInterface;
use Phenix\Database\Migrations\TableColumn;
use Phinx\Db\Adapter\MysqlAdapter;
use Phinx\Db\Adapter\PostgresAdapter;
use Phinx\Db\Adapter\SQLiteAdapter;
use Phinx\Db\Adapter\SqlServerAdapter;

abstract class Column
abstract class Column extends TableColumn
{
protected array $options = [];

protected AdapterInterface|null $adapter = null;

public function __construct(
protected string $name
) {
Expand All @@ -27,20 +20,8 @@ public function getName(): string
return $this->name;
}

public function getOptions(): array
{
return $this->options;
}

abstract public function getType(): string;

public function nullable(): static
{
$this->options['null'] = true;

return $this;
}

public function comment(string $comment): static
{
$this->options['comment'] = $comment;
Expand Down Expand Up @@ -109,36 +90,4 @@ public function limit(int $limit): static

return $this;
}

public function setAdapter(AdapterInterface $adapter): static
{
$this->adapter = $adapter;

return $this;
}

public function getAdapter(): ?AdapterInterface
{
return $this->adapter;
}

public function isMysql(): bool
{
return $this->adapter instanceof MysqlAdapter;
}

public function isPostgres(): bool
{
return $this->adapter instanceof PostgresAdapter;
}

public function isSQLite(): bool
{
return $this->adapter instanceof SQLiteAdapter;
}

public function isSqlServer(): bool
{
return $this->adapter instanceof SqlServerAdapter;
}
}
6 changes: 3 additions & 3 deletions src/Database/Migrations/Columns/Concerns/WithConvenience.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
namespace Phenix\Database\Migrations\Columns\Concerns;

use Phenix\Database\Migrations\Columns\Timestamp;
use Phenix\Database\Migrations\Columns\UnsignedInteger;
use Phenix\Database\Migrations\Columns\UnsignedBigInteger;

trait WithConvenience
{
public function id(string $name = 'id'): UnsignedInteger
public function id(string $name = 'id'): UnsignedBigInteger
{
return $this->addColumnWithAdapter(new UnsignedInteger($name, null, true));
return $this->addColumnWithAdapter(new UnsignedBigInteger($name, true));
}

public function timestamps(bool $timezone = false): self
Expand Down
24 changes: 24 additions & 0 deletions src/Database/Migrations/Columns/Concerns/WithForeignKeys.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

declare(strict_types=1);

namespace Phenix\Database\Migrations\Columns\Concerns;

use Phenix\Database\Migrations\ForeignKey;

trait WithForeignKeys
{
public function foreignKey(
string|array $columns,
string $referencedTable,
string|array $referencedColumns = 'id',
array $options = []
): ForeignKey {
return $this->addForeignKeyWithAdapter(new ForeignKey($columns, $referencedTable, $referencedColumns, $options));
}

public function foreign(string|array $columns): ForeignKey
{
return $this->addForeignKeyWithAdapter(new ForeignKey($columns, '', 'id'));
}
}
78 changes: 78 additions & 0 deletions src/Database/Migrations/ForeignKey.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<?php

declare(strict_types=1);

namespace Phenix\Database\Migrations;

use Phenix\Database\Constants\ColumnAction;

class ForeignKey extends TableColumn
{
public function __construct(
protected string|array $columns,
protected string $referencedTable = '',
protected string|array $referencedColumns = 'id',
array $options = []
) {
$this->options = $options;
}

public function getColumns(): string|array
{
return $this->columns;
}

public function getReferencedTable(): string
{
return $this->referencedTable;
}

public function getReferencedColumns(): string|array
{
return $this->referencedColumns;
}

public function onDelete(string|ColumnAction $action): static
{
$this->options['delete'] = $action instanceof ColumnAction ? $action->value : $action;

return $this;
}

public function onUpdate(string|ColumnAction $action): static
{
$this->options['update'] = $action instanceof ColumnAction ? $action->value : $action;

return $this;
}

public function constraint(string $name): static
{
$this->options['constraint'] = $name;

return $this;
}

public function deferrable(string $deferrable = 'DEFERRED'): static
{
if ($this->isPostgres()) {
$this->options['deferrable'] = $deferrable;
}

return $this;
}

public function references(string|array $columns): static
{
$this->referencedColumns = $columns;

return $this;
}

public function on(string $table): static
{
$this->referencedTable = $table;

return $this;
}
}
78 changes: 78 additions & 0 deletions src/Database/Migrations/Table.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Phenix\Database\Migrations\Columns\Concerns\WithBinary;
use Phenix\Database\Migrations\Columns\Concerns\WithConvenience;
use Phenix\Database\Migrations\Columns\Concerns\WithDateTime;
use Phenix\Database\Migrations\Columns\Concerns\WithForeignKeys;
use Phenix\Database\Migrations\Columns\Concerns\WithJson;
use Phenix\Database\Migrations\Columns\Concerns\WithNetwork;
use Phenix\Database\Migrations\Columns\Concerns\WithNumeric;
Expand All @@ -20,6 +21,7 @@ class Table extends PhinxTable
use WithBinary;
use WithConvenience;
use WithDateTime;
use WithForeignKeys;
use WithJson;
use WithNetwork;
use WithNumeric;
Expand All @@ -31,11 +33,57 @@ class Table extends PhinxTable
*/
protected array $columns = [];

/**
* @var array<ForeignKey>
*/
protected array $foreignKeys = [];

protected bool $executed = false;

public function __destruct()
{
if (! $this->executed) {
$this->save();
}
}

public function getColumnBuilders(): array
{
return $this->columns;
}

public function getForeignKeyBuilders(): array
{
return $this->foreignKeys;
}

public function create(): void
{
$this->addColumnFromBuilders();

parent::create();

$this->executed = true;
}

public function update(): void
{
$this->addColumnFromBuilders();

parent::update();

$this->executed = true;
}

public function save(): void
{
$this->addColumnFromBuilders();

parent::save();

$this->executed = true;
}

/**
* @template T of Column
* @param T $column
Expand All @@ -49,4 +97,34 @@ protected function addColumnWithAdapter(Column $column): Column

return $column;
}

/**
* @template T of ForeignKey
* @param T $foreignKey
* @return T
*/
protected function addForeignKeyWithAdapter(ForeignKey $foreignKey): ForeignKey
{
$foreignKey->setAdapter($this->getAdapter());

$this->foreignKeys[] = $foreignKey;

return $foreignKey;
}

protected function addColumnFromBuilders(): void
{
foreach ($this->columns as $column) {
$this->addColumn($column->getName(), $column->getType(), $column->getOptions());
}

foreach ($this->foreignKeys as $foreignKey) {
$this->addForeignKey(
$foreignKey->getColumns(),
$foreignKey->getReferencedTable(),
$foreignKey->getReferencedColumns(),
$foreignKey->getOptions()
);
}
}
}
62 changes: 62 additions & 0 deletions src/Database/Migrations/TableColumn.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

declare(strict_types=1);

namespace Phenix\Database\Migrations;

use Phinx\Db\Adapter\AdapterInterface;
use Phinx\Db\Adapter\MysqlAdapter;
use Phinx\Db\Adapter\PostgresAdapter;
use Phinx\Db\Adapter\SQLiteAdapter;
use Phinx\Db\Adapter\SqlServerAdapter;

abstract class TableColumn
{
protected array $options = [];

protected AdapterInterface|null $adapter = null;

public function nullable(): static
{
$this->options['null'] = true;

return $this;
}

public function getOptions(): array
{
return $this->options;
}

public function setAdapter(AdapterInterface $adapter): static
{
$this->adapter = $adapter;

return $this;
}

public function getAdapter(): ?AdapterInterface
{
return $this->adapter;
}

public function isMysql(): bool
{
return $this->adapter instanceof MysqlAdapter;
}

public function isPostgres(): bool
{
return $this->adapter instanceof PostgresAdapter;
}

public function isSQLite(): bool
{
return $this->adapter instanceof SQLiteAdapter;
}

public function isSqlServer(): bool
{
return $this->adapter instanceof SqlServerAdapter;
}
}
Loading