public function __construct(string ...$columns) { if ($columns === []) { throw SchemaException::primaryKeyNoColumn(); } $duplicated = array_unique(array_diff_key($columns, array_unique($columns))); if ($duplicated !== []) { throw SchemaException::primaryKeyDuplicatedColumn(...$duplicated); } $this->columns = $columns; }
public final function setTable(string $table_class) : DatabaseInterface { if ($this->isImmutable()) { throw SchemaException::immutable(static::class); } if (!isset(class_implements($table_class)[TableInterface::class])) { throw SchemaException::invalidTable(TableInterface::class, $table_class); } if ($this->hasTable($table_class::getName())) { throw SchemaException::tableAlreadySet(static::class, $table_class); } $this->tables[$table_class::getName()] = $table_class; return $this; }
public function __construct(string $name, string ...$columns) { if ($name === '' || strtolower($name) === 'primary') { throw SchemaException::uniqueKeyInvalidName($name); } if ($columns === []) { throw SchemaException::uniqueKeyNoColumn($name); } $duplicated = array_unique(array_diff_key($columns, array_unique($columns))); if ($duplicated !== []) { throw SchemaException::uniqueKeyDuplicatedColumn($name, ...$duplicated); } $this->name = $name; $this->columns = $columns; }
public function __construct(string $name, $columns, string $parent_table, $parent_columns = null, string $update_rule = 'RESTRICT', string $delete_rule = 'RESTRICT') { if ($name === '' || strtolower($name) === 'primary') { throw SchemaException::foreignKeyInvalidName($name); } $columns = is_array($columns) ? $columns : [$columns]; if ($columns === []) { throw SchemaException::foreignKeyNoColumn($name); } $duplicated = array_unique(array_diff_key($columns, array_unique($columns))); if ($duplicated !== []) { throw SchemaException::foreignKeyDuplicatedChildColumn($name, ...$duplicated); } if ($parent_columns === null) { $parent_columns = $columns; } elseif (!is_array($parent_columns)) { $parent_columns = [$parent_columns]; } $duplicated = array_unique(array_diff_key($parent_columns, array_unique($parent_columns))); if ($duplicated !== []) { throw SchemaException::foreignKeyDuplicatedParentColumn($name, ...$duplicated); } if (count($columns) > count($parent_columns)) { throw SchemaException::foreignKeyMoreChildColumn($name); } elseif (count($columns) < count($parent_columns)) { throw SchemaException::foreignKeyMoreParentColumn($name); } if (!in_array($update_rule, self::RULES)) { throw SchemaException::foreignKeyInvalidUpdateRule($name, $update_rule); } if (!in_array($delete_rule, self::RULES)) { throw SchemaException::foreignKeyInvalidDeleteRule($name, $delete_rule); } $this->name = $name; $this->columns = $columns; $this->parent_table = $parent_table; $this->parent_columns = $parent_columns; $this->update_rule = $update_rule === 'NO ACTION' ? 'RESTRICT' : $update_rule; $this->delete_rule = $delete_rule === 'NO ACTION' ? 'RESTRICT' : $delete_rule; }
public final function setForeignKeyObject(ForeignKey $foreign_key) : TableInterface { if ($this->isImmutable()) { throw SchemaException::immutable(static::class); } if ($this->hasForeignKey($foreign_key->getName())) { throw SchemaException::foreignKeyAlreadySet(static::class, $foreign_key->getName()); } $missing = array_diff($foreign_key->getColumns(), array_keys($this->getColumns())); if ($missing !== []) { throw TableException::columnNotSet(static::class, implode(', ', $missing)); } $this->foreign_keys[$foreign_key->getName()] = $foreign_key; if (!$this->hasIndexWithColumns(...$foreign_key->getColumns())) { $this->setIndexObject(new Index($foreign_key->getName(), ...$foreign_key->getColumns())); } return $this; }