TaoLer/vendor/topthink/think-migration/phinx/Db/Table/Column.php
2024-04-01 10:04:16 +08:00

802 lines
16 KiB
PHP

<?php
/**
* MIT License
* For full license information, please view the LICENSE file that was distributed with this source code.
*/
namespace Phinx\Db\Table;
use Phinx\Config\FeatureFlags;
use Phinx\Db\Adapter\AdapterInterface;
use Phinx\Db\Adapter\PostgresAdapter;
use RuntimeException;
/**
* This object is based loosely on: https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html.
*/
class Column
{
public const BIGINTEGER = AdapterInterface::PHINX_TYPE_BIG_INTEGER;
public const SMALLINTEGER = AdapterInterface::PHINX_TYPE_SMALL_INTEGER;
public const TINYINTEGER = AdapterInterface::PHINX_TYPE_TINY_INTEGER;
public const BINARY = AdapterInterface::PHINX_TYPE_BINARY;
public const BOOLEAN = AdapterInterface::PHINX_TYPE_BOOLEAN;
public const CHAR = AdapterInterface::PHINX_TYPE_CHAR;
public const DATE = AdapterInterface::PHINX_TYPE_DATE;
public const DATETIME = AdapterInterface::PHINX_TYPE_DATETIME;
public const DECIMAL = AdapterInterface::PHINX_TYPE_DECIMAL;
public const FLOAT = AdapterInterface::PHINX_TYPE_FLOAT;
public const INTEGER = AdapterInterface::PHINX_TYPE_INTEGER;
public const STRING = AdapterInterface::PHINX_TYPE_STRING;
public const TEXT = AdapterInterface::PHINX_TYPE_TEXT;
public const TIME = AdapterInterface::PHINX_TYPE_TIME;
public const TIMESTAMP = AdapterInterface::PHINX_TYPE_TIMESTAMP;
public const UUID = AdapterInterface::PHINX_TYPE_UUID;
public const BINARYUUID = AdapterInterface::PHINX_TYPE_BINARYUUID;
/** MySQL-only column type */
public const MEDIUMINTEGER = AdapterInterface::PHINX_TYPE_MEDIUM_INTEGER;
/** MySQL-only column type */
public const ENUM = AdapterInterface::PHINX_TYPE_ENUM;
/** MySQL-only column type */
public const SET = AdapterInterface::PHINX_TYPE_STRING;
/** MySQL-only column type */
public const BLOB = AdapterInterface::PHINX_TYPE_BLOB;
/** MySQL-only column type */
public const YEAR = AdapterInterface::PHINX_TYPE_YEAR;
/** MySQL/Postgres-only column type */
public const JSON = AdapterInterface::PHINX_TYPE_JSON;
/** Postgres-only column type */
public const JSONB = AdapterInterface::PHINX_TYPE_JSONB;
/** Postgres-only column type */
public const CIDR = AdapterInterface::PHINX_TYPE_CIDR;
/** Postgres-only column type */
public const INET = AdapterInterface::PHINX_TYPE_INET;
/** Postgres-only column type */
public const MACADDR = AdapterInterface::PHINX_TYPE_MACADDR;
/** Postgres-only column type */
public const INTERVAL = AdapterInterface::PHINX_TYPE_INTERVAL;
/**
* @var string
*/
protected $name;
/**
* @var string|\Phinx\Util\Literal
*/
protected $type;
/**
* @var int|null
*/
protected $limit;
/**
* @var bool
*/
protected $null = true;
/**
* @var mixed
*/
protected $default;
/**
* @var bool
*/
protected $identity = false;
/**
* Postgres-only column option for identity (always|default)
*
* @var ?string
*/
protected $generated = PostgresAdapter::GENERATED_ALWAYS;
/**
* @var int|null
*/
protected $seed;
/**
* @var int|null
*/
protected $increment;
/**
* @var int|null
*/
protected $scale;
/**
* @var string|null
*/
protected $after;
/**
* @var string|null
*/
protected $update;
/**
* @var string|null
*/
protected $comment;
/**
* @var bool
*/
protected $signed = true;
/**
* @var bool
*/
protected $timezone = false;
/**
* @var array
*/
protected $properties = [];
/**
* @var string|null
*/
protected $collation;
/**
* @var string|null
*/
protected $encoding;
/**
* @var int|null
*/
protected $srid;
/**
* @var array|null
*/
protected $values;
/**
* Column constructor
*/
public function __construct()
{
$this->null = FeatureFlags::$columnNullDefault;
}
/**
* Sets the column name.
*
* @param string $name Name
* @return $this
*/
public function setName(string $name)
{
$this->name = $name;
return $this;
}
/**
* Gets the column name.
*
* @return string|null
*/
public function getName(): ?string
{
return $this->name;
}
/**
* Sets the column type.
*
* @param string|\Phinx\Util\Literal $type Column type
* @return $this
*/
public function setType($type)
{
$this->type = $type;
return $this;
}
/**
* Gets the column type.
*
* @return string|\Phinx\Util\Literal
*/
public function getType()
{
return $this->type;
}
/**
* Sets the column limit.
*
* @param int|null $limit Limit
* @return $this
*/
public function setLimit(?int $limit)
{
$this->limit = $limit;
return $this;
}
/**
* Gets the column limit.
*
* @return int|null
*/
public function getLimit(): ?int
{
return $this->limit;
}
/**
* Sets whether the column allows nulls.
*
* @param bool $null Null
* @return $this
*/
public function setNull(bool $null)
{
$this->null = (bool)$null;
return $this;
}
/**
* Gets whether the column allows nulls.
*
* @return bool
*/
public function getNull(): bool
{
return $this->null;
}
/**
* Does the column allow nulls?
*
* @return bool
*/
public function isNull(): bool
{
return $this->getNull();
}
/**
* Sets the default column value.
*
* @param mixed $default Default
* @return $this
*/
public function setDefault($default)
{
$this->default = $default;
return $this;
}
/**
* Gets the default column value.
*
* @return mixed
*/
public function getDefault()
{
return $this->default;
}
/**
* Sets generated option for identity columns. Ignored otherwise.
*
* @param string|null $generated Generated option
* @return $this
*/
public function setGenerated(?string $generated)
{
$this->generated = $generated;
return $this;
}
/**
* Gets generated option for identity columns. Null otherwise
*
* @return string|null
*/
public function getGenerated(): ?string
{
return $this->generated;
}
/**
* Sets whether or not the column is an identity column.
*
* @param bool $identity Identity
* @return $this
*/
public function setIdentity(bool $identity)
{
$this->identity = $identity;
return $this;
}
/**
* Gets whether or not the column is an identity column.
*
* @return bool
*/
public function getIdentity(): bool
{
return $this->identity;
}
/**
* Is the column an identity column?
*
* @return bool
*/
public function isIdentity(): bool
{
return $this->getIdentity();
}
/**
* Sets the name of the column to add this column after.
*
* @param string $after After
* @return $this
*/
public function setAfter(string $after)
{
$this->after = $after;
return $this;
}
/**
* Returns the name of the column to add this column after.
*
* @return string|null
*/
public function getAfter(): ?string
{
return $this->after;
}
/**
* Sets the 'ON UPDATE' mysql column function.
*
* @param string $update On Update function
* @return $this
*/
public function setUpdate(string $update)
{
$this->update = $update;
return $this;
}
/**
* Returns the value of the ON UPDATE column function.
*
* @return string|null
*/
public function getUpdate(): ?string
{
return $this->update;
}
/**
* Sets the number precision for decimal or float column.
*
* For example `DECIMAL(5,2)`, 5 is the precision and 2 is the scale,
* and the column could store value from -999.99 to 999.99.
*
* @param int|null $precision Number precision
* @return $this
*/
public function setPrecision(?int $precision)
{
$this->setLimit($precision);
return $this;
}
/**
* Gets the number precision for decimal or float column.
*
* For example `DECIMAL(5,2)`, 5 is the precision and 2 is the scale,
* and the column could store value from -999.99 to 999.99.
*
* @return int|null
*/
public function getPrecision(): ?int
{
return $this->limit;
}
/**
* Sets the column identity increment.
*
* @param int $increment Number increment
* @return $this
*/
public function setIncrement(int $increment)
{
$this->increment = $increment;
return $this;
}
/**
* Gets the column identity increment.
*
* @return int|null
*/
public function getIncrement(): ?int
{
return $this->increment;
}
/**
* Sets the column identity seed.
*
* @param int $seed Number seed
* @return $this
*/
public function setSeed(int $seed)
{
$this->seed = $seed;
return $this;
}
/**
* Gets the column identity seed.
*
* @return int
*/
public function getSeed(): ?int
{
return $this->seed;
}
/**
* Sets the number scale for decimal or float column.
*
* For example `DECIMAL(5,2)`, 5 is the precision and 2 is the scale,
* and the column could store value from -999.99 to 999.99.
*
* @param int|null $scale Number scale
* @return $this
*/
public function setScale(?int $scale)
{
$this->scale = $scale;
return $this;
}
/**
* Gets the number scale for decimal or float column.
*
* For example `DECIMAL(5,2)`, 5 is the precision and 2 is the scale,
* and the column could store value from -999.99 to 999.99.
*
* @return int
*/
public function getScale(): ?int
{
return $this->scale;
}
/**
* Sets the number precision and scale for decimal or float column.
*
* For example `DECIMAL(5,2)`, 5 is the precision and 2 is the scale,
* and the column could store value from -999.99 to 999.99.
*
* @param int $precision Number precision
* @param int $scale Number scale
* @return $this
*/
public function setPrecisionAndScale(int $precision, int $scale)
{
$this->setLimit($precision);
$this->scale = $scale;
return $this;
}
/**
* Sets the column comment.
*
* @param string|null $comment Comment
* @return $this
*/
public function setComment(?string $comment)
{
$this->comment = $comment;
return $this;
}
/**
* Gets the column comment.
*
* @return string
*/
public function getComment(): ?string
{
return $this->comment;
}
/**
* Sets whether field should be signed.
*
* @param bool $signed Signed
* @return $this
*/
public function setSigned(bool $signed)
{
$this->signed = (bool)$signed;
return $this;
}
/**
* Gets whether field should be signed.
*
* @return bool
*/
public function getSigned(): bool
{
return $this->signed;
}
/**
* Should the column be signed?
*
* @return bool
*/
public function isSigned(): bool
{
return $this->getSigned();
}
/**
* Sets whether the field should have a timezone identifier.
* Used for date/time columns only!
*
* @param bool $timezone Timezone
* @return $this
*/
public function setTimezone(bool $timezone)
{
$this->timezone = (bool)$timezone;
return $this;
}
/**
* Gets whether field has a timezone identifier.
*
* @return bool
*/
public function getTimezone(): bool
{
return $this->timezone;
}
/**
* Should the column have a timezone?
*
* @return bool
*/
public function isTimezone(): bool
{
return $this->getTimezone();
}
/**
* Sets field properties.
*
* @param array $properties Properties
* @return $this
*/
public function setProperties(array $properties)
{
$this->properties = $properties;
return $this;
}
/**
* Gets field properties
*
* @return array
*/
public function getProperties(): array
{
return $this->properties;
}
/**
* Sets field values.
*
* @param string[]|string $values Value(s)
* @return $this
*/
public function setValues($values)
{
if (!is_array($values)) {
$values = preg_split('/,\s*/', $values) ?: [];
}
$this->values = $values;
return $this;
}
/**
* Gets field values
*
* @return array|null
*/
public function getValues(): ?array
{
return $this->values;
}
/**
* Sets the column collation.
*
* @param string $collation Collation
* @return $this
*/
public function setCollation(string $collation)
{
$this->collation = $collation;
return $this;
}
/**
* Gets the column collation.
*
* @return string|null
*/
public function getCollation(): ?string
{
return $this->collation;
}
/**
* Sets the column character set.
*
* @param string $encoding Encoding
* @return $this
*/
public function setEncoding(string $encoding)
{
$this->encoding = $encoding;
return $this;
}
/**
* Gets the column character set.
*
* @return string|null
*/
public function getEncoding(): ?string
{
return $this->encoding;
}
/**
* Sets the column SRID.
*
* @param int $srid SRID
* @return $this
*/
public function setSrid(int $srid)
{
$this->srid = $srid;
return $this;
}
/**
* Gets the column SRID.
*
* @return int|null
*/
public function getSrid(): ?int
{
return $this->srid;
}
/**
* Gets all allowed options. Each option must have a corresponding `setFoo` method.
*
* @return array
*/
protected function getValidOptions(): array
{
return [
'limit',
'default',
'null',
'identity',
'scale',
'after',
'update',
'comment',
'signed',
'timezone',
'properties',
'values',
'collation',
'encoding',
'srid',
'seed',
'increment',
'generated',
];
}
/**
* Gets all aliased options. Each alias must reference a valid option.
*
* @return array
*/
protected function getAliasedOptions(): array
{
return [
'length' => 'limit',
'precision' => 'limit',
];
}
/**
* Utility method that maps an array of column options to this objects methods.
*
* @param array<string, mixed> $options Options
* @throws \RuntimeException
* @return $this
*/
public function setOptions(array $options)
{
$validOptions = $this->getValidOptions();
$aliasOptions = $this->getAliasedOptions();
if (isset($options['identity']) && $options['identity'] && !isset($options['null'])) {
$options['null'] = false;
}
foreach ($options as $option => $value) {
if (isset($aliasOptions[$option])) {
// proxy alias -> option
$option = $aliasOptions[$option];
}
if (!in_array($option, $validOptions, true)) {
throw new RuntimeException(sprintf('"%s" is not a valid column option.', $option));
}
$method = 'set' . ucfirst($option);
$this->$method($value);
}
return $this;
}
}