Exemplo n.º 1
0
 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;
 }
Exemplo n.º 2
0
 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;
 }
Exemplo n.º 3
0
 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;
 }
Exemplo n.º 4
0
 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;
 }
Exemplo n.º 5
0
 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;
 }