Reflexe
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 = $connection->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\Columnreprezentují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\Columnreprezentujících lokální sloupce, které tvoří cizí klíč.foreignTable: ObjektNette\Database\Reflection\Tablereprezentující cizí tabulku, na kterou cizí klíč odkazuje.foreignColumns: Pole objektůNette\Database\Reflection\Columnreprezentují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";
}