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 konstantyNette\Utils\Type
).nullable
:true
, pokud sloupec může obsahovat hodnotuNULL
, jinakfalse
.primary
:true
, pokud je sloupec součástí primárního klíče, jinakfalse
.autoIncrement
:true
, pokud je sloupec auto-increment, jinakfalse
.default
: Výchozí hodnota sloupce, nebonull
, 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í, jinakfalse
.primary
:true
, pokud je index primárním klíčem, jinakfalse
.
$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
: ObjektNette\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";
}