name = $name; return $this; } /** * Gets the column name. * * @return string|null */ public function getName(): ?string { return $this->name; } /** * Get the base type if defined. Will fallback to `type` if not set. * * Used to get the base type of a column when the column type is a complex/custom type. * * @return string|null */ public function getBaseType(): ?string { if (isset($this->baseType)) { return $this->baseType; } $type = $this->type; if (TypeFactory::getMapped($type)) { $type = TypeFactory::build($type)->getBaseType(); } return $this->baseType = $type; } /** * Sets the base type of the column. * * Used to set the base type of a column when the column type is a complex/custom type. * * @param string|null $baseType Base type * @return $this */ public function setBaseType(?string $baseType) { $this->baseType = $baseType; return $this; } /** * Sets the column type. * * Type names are not validated, as drivers and dialects may implement * platform specific types that are not known by cakephp. * * Drivers are expected to handle unknown types gracefully. * * @param string $type Column type * @return $this */ public function setType(string $type) { $this->type = $type; return $this; } /** * Gets the column type. * * @return string */ public function getType(): string { return $this->type; } /** * Sets the column length. * * @param int|null $length Length * @return $this */ public function setLength(?int $length) { $this->length = $length; return $this; } /** * Gets the column length. * * @return int|null */ public function getLength(): ?int { return $this->length; } /** * Sets whether the column allows nulls. * * @param bool $null Null * @return $this */ public function setNull(bool $null) { $this->null = $null; return $this; } /** * Gets whether the column allows nulls. * * @return bool|null */ public function getNull(): ?bool { return $this->null; } /** * Does the column allow nulls? * * @return bool */ public function isNull(): bool { return $this->getNull() === true; } /** * Sets the default column value. * * @param mixed $default Default * @return $this */ public function setDefault(mixed $default) { $this->default = $default; return $this; } /** * Gets the default column value. * * @return mixed */ public function getDefault(): mixed { 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 the column is an identity column. * * @param bool $identity Identity * @return $this */ public function setIdentity(bool $identity) { $this->identity = $identity; return $this; } /** * Gets whether 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. * * Used by MySQL and MariaDB in ALTER TABLE statements. * * @return string|null */ public function getAfter(): ?string { return $this->after; } /** * Sets the 'ON UPDATE' mysql column function. * * Used by MySQL and MariaDB in ALTER TABLE statements. * * @param string $update On Update function * @return $this */ public function setOnUpdate(string $update) { $this->onUpdate = $update; return $this; } /** * Returns the value of the ON UPDATE column function. * * @return string|null */ public function getOnUpdate(): ?string { return $this->onUpdate; } /** * Sets the number precision for decimal or float column. * * For example `DECIMAL(5,2)`, 5 is the length and 2 is the precision, * 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->precision = $precision; return $this; } /** * Gets the number precision for decimal or float column. * * For example `DECIMAL(5,2)`, 5 is the length and 2 is the precision, * and the column could store value from -999.99 to 999.99. * * @return int|null */ public function getPrecision(): ?int { return $this->precision; } /** * 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 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 unsigned. * * @param bool $unsigned Signed * @return $this */ public function setUnsigned(bool $unsigned) { $this->unsigned = $unsigned; return $this; } /** * Gets whether field should be unsigned. * * @return bool|null */ public function getUnsigned(): ?bool { return $this->unsigned; } /** * Should the column be signed? * * @return bool */ public function isSigned(): bool { return !$this->getUnsigned(); } /** * Should the column be unsigned? * * @return bool */ public function isUnsigned(): bool { return $this->getUnsigned() === true; } /** * Sets the column collation. * * @param string $collation Collation * @return $this */ public function setCollate(string $collation) { $this->collate = $collation; return $this; } /** * Gets the column collation. * * @return string|null */ public function getCollate(): ?string { return $this->collate; } /** * Sets the column SRID for geometry fields. * * @param int $srid SRID * @return $this */ public function setSrid(int $srid) { $this->srid = $srid; return $this; } /** * Gets the column SRID from geometry fields. * * @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 [ 'name', 'length', 'precision', 'default', 'null', 'identity', 'after', 'onUpdate', 'comment', 'unsigned', 'type', 'properties', 'collate', 'srid', 'increment', 'generated', ]; } /** * Utility method that maps an array of column attributes to this object's methods. * * @param array $attributes Attributes * @throws \RuntimeException * @return $this */ public function setAttributes(array $attributes) { $validOptions = $this->getValidOptions(); if (isset($attributes['identity']) && $attributes['identity'] && !isset($attributes['null'])) { $attributes['null'] = false; } foreach ($attributes as $attribute => $value) { if (!in_array($attribute, $validOptions, true)) { throw new RuntimeException(sprintf('"%s" is not a valid column option.', $attribute)); } $method = 'set' . ucfirst($attribute); $this->$method($value); } return $this; } /** * Convert an index into an array that is compatible with the Column constructor. * * @return array */ public function toArray(): array { $type = $this->getType(); $length = $this->getLength(); $precision = $this->getPrecision(); if ($precision !== null && $precision > 0) { if ($type === TableSchemaInterface::TYPE_TIMESTAMP) { $type = 'timestampfractional'; } elseif ($type === TableSchemaInterface::TYPE_DATETIME) { $type = 'datetimefractional'; } } return [ 'name' => $this->getName(), 'baseType' => $this->getBaseType(), 'type' => $type, 'length' => $length, 'null' => $this->getNull(), 'default' => $this->getDefault(), 'generated' => $this->getGenerated(), 'unsigned' => $this->getUnsigned(), 'onUpdate' => $this->getOnUpdate(), 'collate' => $this->getCollate(), 'precision' => $precision, 'srid' => $this->getSrid(), 'comment' => $this->getComment(), 'autoIncrement' => $this->getIdentity(), 'identity' => $this->getIdentity(), ]; } }