WP-Database-Helper/Schema.php

82 lines
2.4 KiB
PHP
Raw Normal View History

2025-02-12 14:03:39 +00:00
<?php
namespace DatabaseHelper;
2025-02-12 14:55:28 +00:00
use DatabaseHelper\enums\Aggregation;
2025-02-12 14:03:39 +00:00
use DatabaseHelper\enums\Charset;
use DatabaseHelper\enums\Collation;
use DatabaseHelper\enums\Engine;
use http\Exception\InvalidArgumentException;
class Schema
{
public string $name = '';
public array $columns = [];
public array $primaryKey = [];
public array $foreignKeys = [];
public Engine $engine = Engine::INNODB;
public Charset $charset = Charset::UTF8;
public Collation $collation = Collation::UTF8_GENERAL_CI;
public function __construct(string $name) {
$this->name = $name;
}
public function requireColumn(string $col): void {
if (!$this->existsColumn($col))
throw new InvalidArgumentException("Column '$col' is not defined.");
}
public function existsColumn(string $col): bool {
return isset($this->columns[$col]);
}
public function existsReference(Schema $schema): bool {
foreach ($this->foreignKeys as $foreignKey)
if ($foreignKey['table'] == $schema->name)
return true;
return false;
}
2025-02-12 14:55:28 +00:00
public function countEntries(): int {
return Database::makeQuery($this)
->aggregate('*', 'count', Aggregation::COUNT)
->query();
}
2025-02-12 14:03:39 +00:00
public function columnType(string $col) {
return $this->columns[$col]['type'];
}
public function primaryKey() {
return $this->columns['primary']['name'];
}
public function copy(): Schema {
$copy = new Schema($this->name);
$copy->columns = genericDeepCopy($this->columns);
$copy->primaryKey = genericDeepCopy($this->primaryKey);
$copy->foreignKeys = genericDeepCopy($this->foreignKeys);
$copy->engine = $this->engine;
$copy->charset = $this->charset;
$copy->collation = $this->collation;
return $copy;
}
public function include(Schema $other): void {
// Create a copy of the other schema.
$otherCopy = $other->copy();
// Add any column that isn't already defined.
foreach ($otherCopy->columns as $colName => $colDef)
if (!isset($this->columns[$colName]))
$this->columns[$colName] = $colDef;
// Add any foreign key that doesn't already exist.
foreach ($other->foreignKeys as $colName => $foreignKey)
if (!isset($this->foreignKeys[$colName]))
$this->foreignKeys[$colName] = $foreignKey;
}
}