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";
}
verze: 4.0 3.x