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";
}