๐ Schema
Note: While schemas are part of the Hector ORM ecosystem, they are available as a standalone package:
hectororm/schema.
You can find it on
Packagist.
You can use them independently of the ORM, in any PHP application. ๐
Hector Schema is the schema introspection and metadata module of Hector ORM. It provides a simple and consistent API to explore and manage your database structure. While tightly integrated with Hector ORM, this package is entirely independent and can be used on its own.
๐ DBMS Compatibility
| DBMS | Version | Compatibility |
|---|---|---|
| MySQL | 8.4 | โ |
| MySQL | 8.0 | โ |
| MySQL | 5.7 | โ |
| MariaDB | 11.7 | โ |
| MariaDB | 11.4 | โ |
| MariaDB | 10.11 | โ |
| MariaDB | 10.6 | โ |
| MariaDB | 10.5 | โ |
| Sqlite | 3.x | โ |
โน๏ธ Know of a DBMS version not listed here but works fine? Contributions are welcome โ open a PR!
๐ง Usage
Generate a schema
The schema generator reads your DB structure and returns rich PHP objects that describe it:
use Hector\Connection\Connection;
use Hector\Schema\Generator\MySQL;
$connection = new Connection('...');
$generator = new MySQL($connection);
$schema = $generator->generateSchema('schema_name');
// Returns a `Hector\Schema\Schema` object
$container = $generator->generateSchemas('schema1_name', 'schema2_name');
// Returns a `Hector\Schema\SchemaContainer` object
Available generators:
-
Hector\Schema\Generator\MySQLโ for MySQL and MariaDB -
Hector\Schema\Generator\Sqliteโ for SQLite
โจ Tip: You can use different generators for different environments (e.g., dev SQLite, prod MySQL).
๐ Caching schemas
Schema generation can be expensive for large databases. This library does not include built-in caching, as caching strategies vary widely.
Instead, you can serialize schema objects and restore them later:
$serialized = serialize($schema);
file_put_contents('cache/schema.ser', $serialized);
// Later...
$schema = unserialize(file_get_contents('cache/schema.ser'));
Inheritance and references between objects are preserved during (de)serialization. This makes caching simple and flexible โ ideal for integrating into your own caching logic ๐
๐ API Reference
This section covers the main classes used to explore database schemas.
Hector\Schema\SchemaContainer
A container for multiple schemas. Useful when your application interacts with multiple databases or schemas.
Key methods:
getSchemas(?string $connection = null): GeneratorhasSchema(string $name, ?string $connection = null): boolgetSchema(string $name, ?string $connection = null): SchemahasTable(string $name, ?string $schemaName = null, ?string $connection = null): boolgetTable(string $name, ?string $schemaName = null, ?string $connection = null): Table
This class is iterable:
foreach ($container as $schema)will yieldHector\Schema\Schemaobjects.
Hector\Schema\Schema
Represents a single schema (i.e., database).
Key methods:
getName(bool $quoted = false): stringgetCharset(): stringgetCollation(): stringgetTables(): GeneratorhasTable(string $name): boolgetTable(string $name): TablegetContainer(): ?SchemaContainer
This class is also iterable:
foreach ($schema as $table)yieldsHector\Schema\Tableobjects.
Hector\Schema\Table
Represents a table and its structure.
Key methods:
-
Identification:
getSchemaName(bool $quoted = false): stringgetName(bool $quoted = false): stringgetFullName(bool $quoted = false): string
-
Metadata:
getType(): stringgetCharset(): ?stringgetCollation(): ?string
-
Columns:
getColumns(): GeneratorgetColumnsName(bool $quoted = false, ?string $tableAlias = null): arrayhasColumn(string $name): boolgetColumn(string $name): ColumngetAutoIncrementColumn(): ?Column
-
Indexes:
getIndexes(?string $type = null): GeneratorhasIndex(string $name): boolgetIndex(string $name): IndexgetPrimaryIndex(): ?Index
-
Foreign Keys:
getForeignKeys(Table $table = null): Generator
-
Other:
getSchema(): Schema
Hector\Schema\Column
Represents a column in a table.
Key methods:
-
Identification:
getName(bool $quoted = false, ?string $tableAlias = null): stringgetFullName(bool $quoted = false): string
-
Metadata:
getPosition(): intgetDefault(): mixedisNullable(): boolgetType(): stringisAutoIncrement(): boolgetMaxlength(): ?intgetNumericPrecision(): ?intgetNumericScale(): ?intisUnsigned(): boolgetCharset(): ?stringgetCollation(): ?string
-
Other:
getTable(): TableisPrimary(): bool
Hector\Schema\Index
Represents a table index.
Key methods:
getName(): stringgetType(): stringgetColumnsName(bool $quoted = false, ?string $tableAlias = null): arraygetTable(): TablegetColumns(): arrayhasColumn(Column $column): bool
Hector\Schema\ForeignKey
Represents a foreign key constraint.
Key methods:
getName(): stringgetColumnsName(bool $quoted = false, ?string $tableAlias = null): arraygetReferencedSchemaName(): stringgetReferencedTableName(): stringgetReferencedColumnsName(bool $quoted = false, ?string $tableAlias = null): arraygetUpdateRule(): stringgetDeleteRule(): stringgetTable(): TablegetColumns(): GeneratorgetReferencedTable(): ?TablegetReferencedColumns(): Generator
๐ Example: Basic schema introspection
$generator = new MySQL($connection);
$schema = $generator->generateSchema('my_database');
foreach ($schema as $table) {
echo "Table: " . $table->getName() . "\n";
foreach ($table->getColumns() as $column) {
echo " Column: " . $column->getName() . " (" . $column->getType() . ")\n";
}
}
This example will output the structure of your database with all tables and their columns. Great for CLI tools, documentation generators or migration scripts! ๐