Reflexe struktury
*****************
.{data-version:3.2.1}
Nette Database poskytuje nástroje pro introspekci databázové struktury pomocí třídy [api: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:
```php
$reflection = $database->getReflection();
```
Získání tabulek
---------------
Readonly vlastnost `$reflection->tables` obsahuje asociativní pole všech tabulek v databázi:
```php
// Výpis názvů všech tabulek
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
```
K dispozici jsou ještě dvě metody:
```php
// 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|api:Nette\Database\Reflection\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
- `$comment: ?string` - komentář tabulky
Sloupce
-------
Vlastnost `columns` tabulky poskytuje asociativní pole sloupců, kde klíčem je název sloupce a hodnotou instance [Column|api:Nette\Database\Reflection\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
- `$comment: ?string` - komentář sloupce
```php
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|api:Nette\Database\Reflection\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íč.
```php
// 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|api:Nette\Database\Reflection\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
```php
// 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";
}
```
{{maintitle: Reflexe databáze v Nette: tabulky, sloupce a indexy}}
{{description: Zjistěte strukturu databáze přímo z PHP: seznam tabulek a informace o sloupcích, indexech a cizích klíčích pomocí reflexe v Nette Database.}}
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');
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
$comment: ?string – komentář 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
$comment: ?string – komentář sloupce
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";
}