Refleksja struktury
*******************
.{data-version:3.2.1}
Nette Database udostępnia narzędzia do introspekcji struktury bazy danych za pomocą klasy [api:Nette\Database\Reflection]. Pozwala ona uzyskać informacje o tabelach, kolumnach, indeksach i kluczach obcych. Refleksji możesz użyć do generowania schematów, tworzenia elastycznych aplikacji pracujących z bazą danych albo ogólnych narzędzi bazodanowych.
Obiekt refleksji uzyskujemy z instancji połączenia z bazą danych:
```php
$reflection = $database->getReflection();
```
Pobieranie tabel
----------------
Właściwość readonly `$reflection->tables` zawiera tablicę asocjacyjną wszystkich tabel w bazie danych:
```php
// Wypisanie nazw wszystkich tabel
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
```
Dostępne są jeszcze dwie metody:
```php
// Sprawdzenie istnienia tabeli
if ($reflection->hasTable('users')) {
echo "Tabela users istnieje";
}
// Zwraca obiekt tabeli; jeśli nie istnieje, rzuca wyjątek
$table = $reflection->getTable('users');
```
Informacje o tabeli
-------------------
Tabelę reprezentuje obiekt [Table|api:Nette\Database\Reflection\Table], który udostępnia następujące właściwości readonly:
- `$name: string` - nazwa tabeli
- `$view: bool` - czy jest to widok
- `$fullName: ?string` - pełna nazwa tabeli wraz ze schematem (jeśli istnieje)
- `$columns: array<string, Column>` - tablica asocjacyjna kolumn tabeli
- `$indexes: Index[]` - tablica indeksów tabeli
- `$primaryKey: ?Index` - klucz główny tabeli albo null
- `$foreignKeys: ForeignKey[]` - tablica kluczy obcych tabeli
- `$comment: ?string` - komentarz tabeli
Kolumny
-------
Właściwość `columns` tabeli udostępnia tablicę asocjacyjną kolumn, gdzie kluczem jest nazwa kolumny, a wartością instancja [Column|api:Nette\Database\Reflection\Column] z tymi właściwościami:
- `$name: string` - nazwa kolumny
- `$table: ?Table` - odwołanie do tabeli kolumny
- `$nativeType: string` - natywny typ bazy danych
- `$size: ?int` - rozmiar/długość typu
- `$nullable: bool` - czy kolumna może zawierać NULL
- `$default: mixed` - wartość domyślna kolumny
- `$autoIncrement: bool` - czy kolumna jest auto-increment
- `$primary: bool` - czy jest częścią klucza głównego
- `$vendor: array` - dodatkowe metadane specyficzne dla danego systemu bazodanowego
- `$comment: ?string` - komentarz kolumny
```php
foreach ($table->columns as $name => $column) {
echo "Kolumna: $name\n";
echo "Typ: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Tak' : 'Nie') . "\n";
}
```
Indeksy
-------
Właściwość `indexes` tabeli udostępnia tablicę indeksów, gdzie każdy indeks jest instancją [Index|api:Nette\Database\Reflection\Index] z tymi właściwościami:
- `$columns: Column[]` - tablica kolumn tworzących indeks
- `$unique: bool` - czy indeks jest unikalny
- `$primary: bool` - czy jest kluczem głównym
- `$name: ?string` - nazwa indeksu
Klucz główny tabeli można uzyskać właściwością `primaryKey`, która zwraca albo obiekt `Index`, albo `null`, jeśli tabela nie ma klucza głównego.
```php
// Wypisanie indeksów
foreach ($table->indexes as $index) {
$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
echo "Indeks" . ($index->name ? " {$index->name}" : '') . ":\n";
echo " Kolumny: $columns\n";
echo " Unikalny: " . ($index->unique ? 'Tak' : 'Nie') . "\n";
}
// Wypisanie klucza głównego
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Klucz główny: $columns\n";
}
```
Klucze obce
-----------
Właściwość `foreignKeys` tabeli udostępnia tablicę kluczy obcych, gdzie każdy klucz obcy jest instancją [ForeignKey|api:Nette\Database\Reflection\ForeignKey] z tymi właściwościami:
- `$foreignTable: Table` - tabela, do której się odwołuje
- `$localColumns: Column[]` - tablica kolumn lokalnych
- `$foreignColumns: Column[]` - tablica kolumn, do których się odwołuje
- `$name: string` - nazwa klucza obcego
```php
// Wypisanie kluczy obcych
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";
}
```
Refleksja struktury
Nette Database udostępnia narzędzia do introspekcji struktury bazy danych za pomocą klasy Nette\Database\Reflection. Pozwala ona uzyskać
informacje o tabelach, kolumnach, indeksach i kluczach obcych. Refleksji możesz użyć do generowania schematów, tworzenia
elastycznych aplikacji pracujących z bazą danych albo ogólnych narzędzi bazodanowych.
Obiekt refleksji uzyskujemy z instancji połączenia z bazą danych:
$reflection = $database->getReflection();
Pobieranie tabel
Właściwość readonly $reflection->tables zawiera tablicę asocjacyjną wszystkich tabel w bazie danych:
// Wypisanie nazw wszystkich tabel
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Dostępne są jeszcze dwie metody:
// Sprawdzenie istnienia tabeli
if ($reflection->hasTable('users')) {
echo "Tabela users istnieje";
}
// Zwraca obiekt tabeli; jeśli nie istnieje, rzuca wyjątek
$table = $reflection->getTable('users');
Tabelę reprezentuje obiekt Table,
który udostępnia następujące właściwości readonly:
$name: string – nazwa tabeli
$view: bool – czy jest to widok
$fullName: ?string – pełna nazwa tabeli wraz ze schematem (jeśli istnieje)
$columns: array<string, Column> – tablica asocjacyjna kolumn tabeli
$indexes: Index[] – tablica indeksów tabeli
$primaryKey: ?Index – klucz główny tabeli albo null
$foreignKeys: ForeignKey[] – tablica kluczy obcych tabeli
$comment: ?string – komentarz tabeli
Kolumny
Właściwość columns tabeli udostępnia tablicę asocjacyjną kolumn, gdzie kluczem jest nazwa kolumny, a
wartością instancja Column z tymi
właściwościami:
$name: string – nazwa kolumny
$table: ?Table – odwołanie do tabeli kolumny
$nativeType: string – natywny typ bazy danych
$size: ?int – rozmiar/długość typu
$nullable: bool – czy kolumna może zawierać NULL
$default: mixed – wartość domyślna kolumny
$autoIncrement: bool – czy kolumna jest auto-increment
$primary: bool – czy jest częścią klucza głównego
$vendor: array – dodatkowe metadane specyficzne dla danego systemu bazodanowego
$comment: ?string – komentarz kolumny
foreach ($table->columns as $name => $column) {
echo "Kolumna: $name\n";
echo "Typ: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Tak' : 'Nie') . "\n";
}
Indeksy
Właściwość indexes tabeli udostępnia tablicę indeksów, gdzie każdy indeks jest instancją Index z tymi właściwościami:
$columns: Column[] – tablica kolumn tworzących indeks
$unique: bool – czy indeks jest unikalny
$primary: bool – czy jest kluczem głównym
$name: ?string – nazwa indeksu
Klucz główny tabeli można uzyskać właściwością primaryKey, która zwraca albo obiekt Index,
albo null, jeśli tabela nie ma klucza głównego.
// Wypisanie indeksów
foreach ($table->indexes as $index) {
$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
echo "Indeks" . ($index->name ? " {$index->name}" : '') . ":\n";
echo " Kolumny: $columns\n";
echo " Unikalny: " . ($index->unique ? 'Tak' : 'Nie') . "\n";
}
// Wypisanie klucza głównego
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Klucz główny: $columns\n";
}
Klucze obce
Właściwość foreignKeys tabeli udostępnia tablicę kluczy obcych, gdzie każdy klucz obcy jest instancją ForeignKey z tymi
właściwościami:
$foreignTable: Table – tabela, do której się odwołuje
$localColumns: Column[] – tablica kolumn lokalnych
$foreignColumns: Column[] – tablica kolumn, do których się odwołuje
$name: string – nazwa klucza obcego
// Wypisanie kluczy obcych
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";
}