php-yaoi/php-yaoi

View on GitHub
src/Database/Definition/Columns.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php

namespace Yaoi\Database\Definition;

use Yaoi\String\Utils;

class Columns
{
    /**
     * @var Column[]
     */
    private $_arrayOfColumnData = array();
    /**
     * @var Table
     */
    private $table;

    public function __construct(Table $table)
    {
        $this->table = $table;
        $table->columns = $this;
    }

    public function __set($name, $column)
    {
        if (is_int($column)) {
            $column = new Column($column);
            //$this->_arrayOfColumnData[$name] = $column;
        }

        // another column reference
        if (!empty($column->table)
            && $column->table->schemaName != $this->table->schemaName) {
            $refColumn = $column;
            $column = clone $column;

            $column->propertyName = $name;
            $column->schemaName = Utils::fromCamelCase($name);
            $column->table = $this->table;

            //$this->_arrayOfColumnData[$name] = $column;
            $foreignKey = new ForeignKey(array($column), array($refColumn));
            $column->foreignKey = $foreignKey;
            //$this->table->addForeignKey($foreignKey);
            $column->setFlag(Column::AUTO_ID, false);
        } else {
            $column->propertyName = $name;
            $column->schemaName = Utils::fromCamelCase($name);
            $column->table = $this->table;
        }


        if ($column->flags & Column::AUTO_ID) {
            $this->table->autoIdColumn = $column;
            if (!$this->table->primaryKey) {
                $this->table->setPrimaryKey($column);
            }
        }

        if ($column->isUnique) {
            $index = new Index($column);
            $index->setType(Index::TYPE_UNIQUE);
            $this->table->addIndex($index);
        } elseif ($column->isIndexed) {
            $index = new Index($column);
            $index->setType(Index::TYPE_KEY);
            $this->table->addIndex($index);
        }

        $this->table->database()->getUtility()->checkColumn($column);
        $this->_arrayOfColumnData[$name] = $column;

    }

    public function __get($name)
    {
        if (!isset($this->_arrayOfColumnData[$name])) {
            throw new Exception('Unknown column ' . $name);
        }
        return $this->_arrayOfColumnData[$name];
    }

    public function __isset($name)
    {
        return isset($this->_arrayOfColumnData[$name]);
    }

    public function __unset($name)
    {
        if (!isset($this->_arrayOfColumnData[$name])) {
            return;
        }
        unset($this->_arrayOfColumnData[$name]);
    }

    /**
     * @return Column[]
     */
    public function getArray()
    {
        return $this->_arrayOfColumnData;
    }
}