Reflexe struktury

Nette Database poskytuje nástroje pro introspekci databázové struktury pomocí třídy Nette\Database\Reflection\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();

Práce s tabulkami

Pomocí reflexe můžeme procházet všechny tabulky v databázi:

getTables(): Nette\Database\Reflection\Table[]

Vrací asocitivní pole, kde klíčem je název tabulky a hodnotou pole s metadaty tabulky.

// Výpis názvů všech tabulek
foreach ($reflection->getTables() as $table) {
	echo $table['name'] . "\n";
}

hasTable (string $name): bool

Vrací true, pokud tabulka existuje, jinak false.

// Ověření existence tabulky
if ($reflection->hasTable('users')) {
	echo "Tabulka users existuje";
}

getTable (string $name): Nette\Database\Reflection\Table

Vrací objekt Nette\Database\Reflection\Table reprezentující danou tabulku. Pokud tabulka neexistuje, vyhodí výjimku Nette\Database\Exception\MissingTableException.

// Získání konkrétní tabulky
$table = $reflection->getTable('users');

Informace o sloupcích

Objekt Nette\Database\Reflection\Table, který získáme voláním getTable(), nám umožňuje získat detailní informace o sloupcích tabulky.

getColumns(): Nette\Database\Reflection\Column[]

Vrací pole objektů Nette\Database\Reflection\Column reprezentujících sloupce tabulky.

getColumn (string $name): Nette\Database\Reflection\Column

Vrací objekt Nette\Database\Reflection\Column reprezentující daný sloupec. Pokud sloupec neexistuje, vyhodí výjimku Nette\Database\Exception\MissingColumnException.

Objekt Column poskytuje tyto vlastnosti:

  • name: Název sloupce.
  • nativeType: Datový typ sloupce specifický pro danou databázi.
  • type: Normalizovaný datový typ sloupce (viz konstanty Nette\Utils\Type).
  • nullable: true, pokud sloupec může obsahovat hodnotu NULL, jinak false.
  • primary: true, pokud je sloupec součástí primárního klíče, jinak false.
  • autoIncrement: true, pokud je sloupec auto-increment, jinak false.
  • default: Výchozí hodnota sloupce, nebo null, pokud není definována.
  • vendor: Pole s dalšími informacemi specifickými pro danou databázi.
// Procházení všech sloupců tabulky users
$table = $reflection->getTable('users');
foreach ($table->getColumns() as $column) {
	echo "Sloupec: " . $column->name . "\n";
	echo "Typ: " . $column->nativeType . "\n";
	echo "Může být NULL: " . ($column->nullable ? 'Ano' : 'Ne') . "\n";
	echo "Výchozí hodnota: " . ($column->default ?? 'Není') . "\n";
	echo "Je primární klíč: " . ($column->primary ? 'Ano' : 'Ne') . "\n";
	echo "Je auto-increment: " . ($column->autoIncrement ? 'Ano' : 'Ne') . "\n";
}

// Získání konkrétního sloupce
$idColumn = $table->getColumn('id');

Indexy a primární klíče

getIndexes(): Nette\Database\Reflection\Index[]

Vrací pole objektů Nette\Database\Reflection\Index reprezentujících indexy tabulky.

getIndex (string $name): Nette\Database\Reflection\Index

Vrací objekt Nette\Database\Reflection\Index reprezentující daný index. Pokud index neexistuje, vyhodí výjimku Nette\Database\Exception\MissingIndexException.

getPrimaryKey(): ?Nette\Database\Reflection\Index

Vrací objekt Nette\Database\Reflection\Index reprezentující primární klíč tabulky, nebo null, pokud tabulka nemá primární klíč.

Objekt Index poskytuje tyto vlastnosti:

  • name: Název indexu.
  • columns: Pole objektů Nette\Database\Reflection\Column reprezentujících sloupce, které jsou součástí indexu.
  • unique: true, pokud je index unikátní, jinak false.
  • primary: true, pokud je index primárním klíčem, jinak false.
$table = $reflection->getTable('users');

$vypisNazvySloupcu = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));

// Výpis všech indexů
foreach ($table->getIndexes() as $index) {
	echo "Index: " . ($index->name ?? 'Nepojmenovaný') . "\n";
	echo "Sloupce: " . $vypisNazvySloupcu($index->columns) . "\n";
	echo "Je unikátní: " . ($index->unique ? 'Ano' : 'Ne') . "\n";
	echo "Je primární klíč: " . ($index->primary ? 'Ano' : 'Ne') . "\n";
}

// Získání primárního klíče
if ($primaryKey = $table->getPrimaryKey()) {
	echo "Primární klíč: " . $vypisNazvySloupcu($primaryKey->columns) . "\n";
}

Cizí klíče

getForeignKeys(): Nette\Database\Reflection\ForeignKey[]

Vrací pole objektů Nette\Database\Reflection\ForeignKey reprezentujících cizí klíče tabulky.

getForeignKey (string $name): Nette\Database\Reflection\ForeignKey

Vrací objekt Nette\Database\Reflection\ForeignKey reprezentující daný cizí klíč. Pokud cizí klíč neexistuje, vyhodí výjimku Nette\Database\Exception\MissingForeignKeyException.

Objekt ForeignKey poskytuje tyto vlastnosti:

  • name: Název cizího klíče.
  • localColumns: Pole objektů Nette\Database\Reflection\Column reprezentujících lokální sloupce, které tvoří cizí klíč.
  • foreignTable: Objekt Nette\Database\Reflection\Table reprezentující cizí tabulku, na kterou cizí klíč odkazuje.
  • foreignColumns: Pole objektů Nette\Database\Reflection\Column reprezentujících cizí sloupce, na které cizí klíč odkazuje.
$table = $reflection->getTable('books');

$vypisNazvySloupcu = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));

foreach ($table->getForeignKeys() as $fk) {
	echo "Cizí klíč: " . ($fk->name ?? 'Nepojmenovaný') . "\n";
	echo "Lokální sloupce: " . $vypisNazvySloupcu($fk->localColumns) . "\n";
	echo "Odkazuje na tabulku: {$fk->foreignTable->name}\n";
	echo "Odkazuje na sloupce: " . $vypisNazvySloupcu($fk->foreignColumns) . "\n";
}
verze: 4.0 3.x