Skip to content

Commit

Permalink
refle
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Dec 22, 2024
1 parent 01584bf commit 6eb426e
Show file tree
Hide file tree
Showing 2 changed files with 126 additions and 99 deletions.
116 changes: 17 additions & 99 deletions database/cs/reflection.texy
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
Reflexe struktury
*****************

.{data-version:3.2.4}
Nette Database poskytuje nástroje pro introspekci databázové struktury pomocí třídy [api: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ů.
.{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:

Expand All @@ -12,75 +12,34 @@ $reflection = $database->getReflection();


Práce s tabulkami
=================
-----------------

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


getTables(): Nette\Database\Reflection\Table[] .[method]
--------------------------------------------------------
Vrací asocitivní pole, kde klíčem je název tabulky a hodnotou pole s metadaty tabulky.

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


hasTable(string $name): bool .[method]
--------------------------------------
Vrací `true`, pokud tabulka existuje, jinak `false`.

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


getTable(string $name): Nette\Database\Reflection\Table .[method]
-----------------------------------------------------------------
Vrací objekt `Nette\Database\Reflection\Table` reprezentující danou tabulku. Pokud tabulka neexistuje, vyhodí výjimku `Nette\Database\Exception\MissingTableException`.

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


Informace o sloupcích
=====================

Objekt [api: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[] .[method]
----------------------------------------------------------
Vrací pole objektů `Nette\Database\Reflection\Column` reprezentujících sloupce tabulky.
---------------------


getColumn(string $name): Nette\Database\Reflection\Column .[method]
-------------------------------------------------------------------
Vrací objekt [api: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.
Pro každou tabulku můžeme získat detailní informace o jejích sloupcích:

```php
// Procházení všech sloupců tabulky users
$table = $reflection->getTable('users');
foreach ($table->getColumns() as $column) {
// Procházení všech sloupců
foreach ($table->columns as $column) {
echo "Sloupec: " . $column->name . "\n";
echo "Typ: " . $column->nativeType . "\n";
echo "Může být NULL: " . ($column->nullable ? 'Ano' : 'Ne') . "\n";
Expand All @@ -95,76 +54,35 @@ $idColumn = $table->getColumn('id');


Indexy a primární klíče
=======================
-----------------------


getIndexes(): Nette\Database\Reflection\Index[] .[method]
---------------------------------------------------------
Vrací pole objektů `Nette\Database\Reflection\Index` reprezentujících indexy tabulky.


getIndex(string $name): Nette\Database\Reflection\Index .[method]
-----------------------------------------------------------------
Vrací objekt [api:Nette\Database\Reflection\Index] reprezentující daný index. Pokud index neexistuje, vyhodí výjimku `Nette\Database\Exception\MissingIndexException`.


getPrimaryKey(): ?Nette\Database\Reflection\Index .[method]
-----------------------------------------------------------
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`.
Reflection poskytuje informace o indexech a primárních klíčích:

```php
$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) {
foreach ($table->indexes 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";
if ($table->primaryKey) {
echo "Primární klíč: " . $vypisNazvySloupcu($table->primaryKey->columns) . "\n";
}
```


Cizí klíče
==========
----------


getForeignKeys(): Nette\Database\Reflection\ForeignKey[] .[method]
------------------------------------------------------------------
Vrací pole objektů `Nette\Database\Reflection\ForeignKey` reprezentujících cizí klíče tabulky.


getForeignKey(string $name): Nette\Database\Reflection\ForeignKey .[method]
---------------------------------------------------------------------------
Vrací objekt [api: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.
Můžeme také získat informace o cizích klíčích:

```php
$table = $reflection->getTable('books');

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

foreach ($table->getForeignKeys() as $fk) {
foreach ($table->foreignKeys 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";
Expand Down
109 changes: 109 additions & 0 deletions database/cs/reflection2.texy
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
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();
```


Práce s tabulkami
=================

Přístup k tabulkám poskytuje třída `Nette\Database\Reflection`:


Property `tables`: array<string, Table>
---------------------------------------

Readonly vlastnost obsahující asociativní pole všech tabulek v databázi, kde klíčem je název tabulky a hodnotou instance `Table`.

```php
// Výpis názvů všech tabulek
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
```


Metody pro práci s tabulkami
----------------------------

- `getTables(): Table[]` - Vrací indexované pole všech tabulek
- `hasTable(string $name): bool` - Ověří existenci tabulky
- `getTable(string $name): Table` - Vrátí objekt reprezentující danou tabulku. Pokud tabulka neexistuje, vyhodí výjimku.


Informace o struktuře tabulky
=============================

Třída [api:Nette\Database\Reflection\Table] poskytuje následující readonly vlastnosti:


Property `columns`: array<string, Column>
-----------------------------------------

Asociativní pole sloupců tabulky, kde klíčem je název sloupce a hodnotou instance `Column` s těmito vlastnostmi:

- `name`: string - Název 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 nebo NULL
- `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

```php
$table = $reflection->getTable('users');
foreach ($table->columns as $name => $column) {
echo "Sloupec: $name\n";
echo "Typ: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Ano' : 'Ne') . "\n";
}
```


Property `indexes`: Index[]
---------------------------

Pole všech indexů tabulky. Každý index (`Index`) obsahuje:

- `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 (může být NULL)


Property `primaryKey`: ?Index
-----------------------------

Objekt reprezentující primární klíč tabulky nebo NULL, pokud tabulka nemá primární klíč.


Property `foreignKeys`: ForeignKey[]
------------------------------------

Pole cizích klíčů tabulky. Každý cizí klíč (`ForeignKey`) obsahuje:

- `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 (může být NULL)

```php
$table = $reflection->getTable('books');

// 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}:\n";
echo " $localCols -> {$fk->foreignTable->name}($foreignCols)\n";
}
```

0 comments on commit 6eb426e

Please sign in to comment.