Cake\Database\Schema\PostgresSchema::columnSql PHP Method

columnSql() public method

{@inheritDoc}
public columnSql ( Cake\Database\Schema\Table $table, $name )
$table Cake\Database\Schema\Table
    public function columnSql(Table $table, $name)
    {
        $data = $table->column($name);
        $out = $this->_driver->quoteIdentifier($name);
        $typeMap = ['boolean' => ' BOOLEAN', 'binary' => ' BYTEA', 'float' => ' FLOAT', 'decimal' => ' DECIMAL', 'date' => ' DATE', 'time' => ' TIME', 'datetime' => ' TIMESTAMP', 'timestamp' => ' TIMESTAMP', 'uuid' => ' UUID', 'json' => ' JSONB'];
        if (isset($typeMap[$data['type']])) {
            $out .= $typeMap[$data['type']];
        }
        if ($data['type'] === 'integer' || $data['type'] === 'biginteger') {
            $type = $data['type'] === 'integer' ? ' INTEGER' : ' BIGINT';
            if ([$name] === $table->primaryKey() || $data['autoIncrement'] === true) {
                $type = $data['type'] === 'integer' ? ' SERIAL' : ' BIGSERIAL';
                unset($data['null'], $data['default']);
            }
            $out .= $type;
        }
        if ($data['type'] === 'text' && $data['length'] !== Table::LENGTH_TINY) {
            $out .= ' TEXT';
        }
        if ($data['type'] === 'string' || $data['type'] === 'text' && $data['length'] === Table::LENGTH_TINY) {
            $isFixed = !empty($data['fixed']);
            $type = ' VARCHAR';
            if ($isFixed) {
                $type = ' CHAR';
            }
            $out .= $type;
            if (isset($data['length']) && $data['length'] != 36) {
                $out .= '(' . (int) $data['length'] . ')';
            }
        }
        $hasCollate = ['text', 'string'];
        if (in_array($data['type'], $hasCollate, true) && isset($data['collate']) && $data['collate'] !== '') {
            $out .= ' COLLATE "' . $data['collate'] . '"';
        }
        if ($data['type'] === 'float' && isset($data['precision'])) {
            $out .= '(' . (int) $data['precision'] . ')';
        }
        if ($data['type'] === 'decimal' && (isset($data['length']) || isset($data['precision']))) {
            $out .= '(' . (int) $data['length'] . ',' . (int) $data['precision'] . ')';
        }
        if (isset($data['null']) && $data['null'] === false) {
            $out .= ' NOT NULL';
        }
        if (isset($data['null']) && $data['null'] === true && $data['type'] === 'timestamp') {
            $out .= ' DEFAULT NULL';
            unset($data['default']);
        }
        if (isset($data['default']) && $data['type'] !== 'timestamp') {
            $defaultValue = $data['default'];
            if ($data['type'] === 'boolean') {
                $defaultValue = (bool) $defaultValue;
            }
            $out .= ' DEFAULT ' . $this->_driver->schemaValue($defaultValue);
        }
        return $out;
    }

Usage Example

Example #1
0
 /**
  * Test generating a column that is a primary key.
  *
  * @return void
  */
 public function testColumnSqlPrimaryKey()
 {
     $driver = $this->_getMockedDriver();
     $schema = new PostgresSchema($driver);
     $table = new Table('schema_articles');
     $table->addColumn('id', ['type' => 'integer', 'null' => false])->addConstraint('primary', ['type' => 'primary', 'columns' => ['id']]);
     $result = $schema->columnSql($table, 'id');
     $this->assertEquals($result, '"id" SERIAL');
 }