projek-xyz/slim-framework

View on GitHub
src/Database/Schema/AlterSchema.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
namespace Projek\Slim\Database\Schema;

use Projek\Slim\Database\Schema;
use Slim\PDO\Database;

class AlterSchema extends Schema
{
    use DefinitionsTrait;

    protected $build;

    protected $callback;

    /**
     *  @inheritdoc
     */
    public function build(Database $database = null)
    {
        call_user_func($this->callback);

        return sprintf('ALTER TABLE %s %s', $this->table, (string) $this);
    }

    public function rename($newName)
    {
        $this->build[] = sprintf('RENAME TO %s', $newName);

        return $this;
    }

    public function addColumn($name, array $definition, $after = null)
    {
        return $this->column('add', [$name, $this->buildDefinition($definition), $after]);
    }

    public function modifyColumn($column, array $definition, $after = null)
    {
        return $this->column('modify', [$column, $this->buildDefinition($definition), $after]);
    }

    public function changeColumn($column, $newName, array $definition, $after = null)
    {
        return $this->column('change', [$column, $newName, $this->buildDefinition($definition), $after]);
    }

    public function dropColumn($column)
    {
        return $this->column('drop', [$column]);
    }

    protected function column($task, $params = [])
    {
        $count = count($params);
        array_unshift($params, strtoupper($task));

        if ($count > 1) {
            $after = array_pop($params);
            $params[] = $after ? 'AFTER '.$after : '';
        }

        $this->build[] = vsprintf('%s COLUMN'.str_repeat(' %s', $count), $params);

        return $this;
    }

    public function addIndex($indexName, array $columns)
    {
        $this->build[] = sprintf('ADD INDEX %s (%s)', $indexName, implode(',', $columns));

        return $this;
    }

    public function renameIndex($indexName, $newname)
    {
        $this->build[] = sprintf('RENAME INDEX %s TO %s', $indexName, $newname);

        return $this;
    }

    public function dropIndex($indexName)
    {
        $this->build[] = sprintf('DROP INDEX %s', $indexName);

        return $this;
    }

    public function addPrimary(array $columns)
    {
        $this->build[] = sprintf('ADD PRIMARY KEY (%s)', implode(',', $columns));

        return $this;
    }

    public function dropPrimary()
    {
        $this->build[] = 'DROP PRIMARY KEY';

        return $this;
    }

    public function addUnique($indexName, array $columns)
    {
        $this->build[] = sprintf('ADD UNIQUE INDEX %s (%s)', $indexName, implode(',', $columns));

        return $this;
    }

    public function addForeign($reference, $field, $column = null, $foreign = null)
    {
        $column = $column ?: $reference.'_'.$field;
        $foreign = $foreign ?: $this->table.'_'.$column;
        $format = 'ADD FOREIGN KEY %s (%s) REFERENCES %s (%s)';
        $this->build[] = sprintf($format, $foreign, $column, $reference, $field);

        return $this;
    }

    public function dropForeign($indexName)
    {
        $this->build[] = sprintf('DROP FOREIGN KEY %s', $indexName);

        return $this;
    }

    public function __toString()
    {
        return implode(', ', $this->build);
    }
}