Reflexe struktury
Nette Database poskytuje nástroje pro introspekci databázové struktury pomocí třídy Nette\Database\Reflection. Ta umožňuje získávat informace o tabulkách, sloupcích, indexech a cizích klíčích. Reflexi můžete využít ke generování schémat, vytváření flexibilních aplikací pracujících s databází nebo obecných databázových nástrojů.
Objekt reflexe získáme z instance připojení k databázi:
$reflection = $database->getReflection();
Získání tabulek
Readonly vlastnost $reflection->tables
obsahuje asociativní pole všech tabulek v databázi:
// Výpis názvů všech tabulek
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
K dispozici jsou ještě dvě metody:
// Ověření existence tabulky
if ($reflection->hasTable('users')) {
echo "Tabulka users existuje";
}
// Vrátí objekt tabulky; pokud neexistuje, vyhodí výjimku
$table = $reflection->getTable('users');
Informace o tabulce
Tabulka je reprezentována objektem Table, který poskytuje následující readonly vlastnosti:
$name: string
– název tabulky$view: bool
– zda se jedná o pohled$fullName: ?string
– plný název tabulky včetně schématu (pokud existuje)$columns: array<string, Column>
– asociativní pole sloupců tabulky$indexes: Index[]
– pole indexů tabulky$primaryKey: ?Index
– primární klíč tabulky nebo null$foreignKeys: ForeignKey[]
– pole cizích klíčů tabulky
Sloupce
Vlastnost columns
tabulky poskytuje asociativní pole sloupců, kde klíčem je název sloupce a hodnotou instance
Column s těmito vlastnostmi:
$name: string
– název sloupce$table: ?Table
– reference na tabulku sloupce$nativeType: string
– nativní databázový typ$size: ?int
– velikost/délka typu$nullable: bool
– zda může sloupec obsahovat NULL$default: mixed
– výchozí hodnota sloupce$autoIncrement: bool
– zda je sloupec auto-increment$primary: bool
– zda je součástí primárního klíče$vendor: array
– dodatečná metadata specifická pro daný databázový systém
foreach ($table->columns as $name => $column) {
echo "Sloupec: $name\n";
echo "Typ: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Ano' : 'Ne') . "\n";
}
Indexy
Vlastnost indexes
tabulky poskytuje pole indexů, kde každý index je instance Index s těmito vlastnostmi:
$columns: Column[]
– pole sloupců tvořících index$unique: bool
– zda je index unikátní$primary: bool
– zda jde o primární klíč$name: ?string
– název indexu
Primární klíč tabulky lze získat pomocí vlastnosti primaryKey
, která vrací buď objekt Index
,
nebo null
v případě, že tabulka nemá primární klíč.
// Výpis indexů
foreach ($table->indexes as $index) {
$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
echo "Index" . ($index->name ? " {$index->name}" : '') . ":\n";
echo " Sloupce: $columns\n";
echo " Unique: " . ($index->unique ? 'Ano' : 'Ne') . "\n";
}
// Výpis primárního klíče
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Primární klíč: $columns\n";
}
Cizí klíče
Vlastnost foreignKeys
tabulky poskytuje pole cizích klíčů, kde každý cizí klíč je instance ForeignKey s těmito vlastnostmi:
$foreignTable: Table
– odkazovaná tabulka$localColumns: Column[]
– pole lokálních sloupců$foreignColumns: Column[]
– pole odkazovaných sloupců$name: ?string
– název cizího klíče
// Výpis cizích klíčů
foreach ($table->foreignKeys as $fk) {
$localCols = implode(', ', array_map(fn($col) => $col->name, $fk->localColumns));
$foreignCols = implode(', ', array_map(fn($col) => $col->name, $fk->foreignColumns));
echo "FK" . ($fk->name ? " {$fk->name}" : '') . ":\n";
echo " $localCols -> {$fk->foreignTable->name}($foreignCols)\n";
}