Reflexe
Nette Database zapewnia narzędzia do introspekcji struktury bazy danych przy użyciu klasy Nette\Database\Reflection\Reflection. Pozwala to na pobieranie informacji o tabelach, kolumnach, indeksach i kluczach obcych. Refleksja może być używana do generowania schematów, tworzenia elastycznych aplikacji opartych na bazach danych lub ogólnych narzędzi bazodanowych.
Obiekt refleksji można uzyskać z instancji połączenia z bazą danych:
$reflection = $connection->getReflection();
Praca z tabelami
Używając refleksji możemy przeglądać wszystkie tabele w bazie danych:
getTables(): Nette\Database\Reflection\Table[]
Zwraca tablicę asocjacyjną, w której kluczem jest nazwa tabeli, a wartością jest tablica metadanych tabeli.
// Wyświetlanie wszystkich nazw tabel
foreach ($reflection->getTables() as $table) {
echo $table['name'] . "\n";
}
hasTable(string $name): bool
Zwraca true
jeśli tabela istnieje, w przeciwnym razie false
.
// Sprawdzanie istnienia tabeli
if ($reflection->hasTable('users')) {
echo "The 'users' table exists";
}
getTable(string $name): Nette\Database\Reflection\Table
Zwraca obiekt Nette\Database\Reflection\Table
reprezentujący podaną tabelę. Jeśli tabela nie istnieje,
zgłaszany jest wyjątek Nette\Database\Exception\MissingTableException
.
// Pobieranie określonej tabeli
$table = $reflection->getTable('users');
Informacje o kolumnach
Obiekt Nette\Database\Reflection\Table,
uzyskany przez wywołanie getTable()
, umożliwia pobranie szczegółowych informacji o kolumnach tabeli.
getColumns(): Nette\Database\Reflection\Column[]
Zwraca tablicę obiektów Nette\Database\Reflection\Column
reprezentujących kolumny tabeli.
getColumn(string $name): Nette\Database\Reflection\Column
Zwraca obiekt Nette\Database\Reflection\Column
reprezentujący daną kolumnę. Jeśli kolumna nie istnieje, zgłaszany jest wyjątek
Nette\Database\Exception\MissingColumnException
.
Obiekt Column
udostępnia następujące właściwości:
name
: Nazwa kolumny.nativeType
: Typ danych kolumny specyficzny dla bazy danych.type
: Znormalizowany typ danych kolumny (patrz stałeNette\Utils\Type
).nullable
:true
jeśli kolumna może zawieraćNULL
, w przeciwnym raziefalse
.primary
:true
jeśli kolumna jest częścią klucza głównego, w przeciwnym raziefalse
.autoIncrement
:true
jeśli kolumna jest automatycznie zwiększana, w przeciwnym raziefalse
.default
: Wartość domyślna kolumny lubnull
, jeśli nie została zdefiniowana.vendor
: Tablica z dodatkowymi informacjami specyficznymi dla bazy danych.
// Iterowanie po wszystkich kolumnach w tabeli "users
$table = $reflection->getTable('users');
foreach ($table->getColumns() as $column) {
echo "Column: " . $column->name . "\n";
echo "Type: " . $column->nativeType . "\n";
echo "Allows NULL: " . ($column->nullable ? 'Yes': 'No') . "\n";
echo "Default value: " . ($column->default ?? 'None') . "\n";
echo "Is primary key: " . ($column->primary ? 'Yes': 'No') . "\n";
echo "Is auto-increment: " . ($column->autoIncrement ? 'Yes': 'No') . "\n";
}
// Pobieranie określonej kolumny
$idColumn = $table->getColumn('id');
Indeksy i klucze podstawowe
getIndexes(): Nette\Database\Reflection\Index[]
Zwraca tablicę obiektów Nette\Database\Reflection\Index
reprezentujących indeksy tabeli.
getIndex(string $name): Nette\Database\Reflection\Index
Zwraca obiekt Nette\Database\Reflection\Index reprezentujący
podany indeks. Jeśli indeks nie istnieje, zgłaszany jest wyjątek
Nette\Database\Exception\MissingIndexException
.
getPrimaryKey(): ?Nette\Database\Reflection\Index
Zwraca obiekt Nette\Database\Reflection\Index
reprezentujący klucz podstawowy tabeli lub null
,
jeśli tabela nie ma klucza podstawowego.
Obiekt Index
udostępnia następujące właściwości:
name
: Nazwa indeksu.columns
: Tablica obiektówNette\Database\Reflection\Column
reprezentujących kolumny, które są częścią indeksu.unique
:true
jeśli indeks jest unikalny, w przeciwnym raziefalse
.primary
:true
jeśli indeks jest kluczem podstawowym, w przeciwnym raziefalse
.
$table = $reflection->getTable('users');
$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));
// Wyświetlanie wszystkich indeksów
foreach ($table->getIndexes() as $index) {
echo "Index: " . ($index->name ?? 'Unnamed') . "\n";
echo "Columns: " . $printColumnNames($index->columns) . "\n";
echo "Is unique: " . ($index->unique ? 'Yes': 'No') . "\n";
echo "Is primary key: " . ($index->primary ? 'Yes': 'No') . "\n";
}
// Pobieranie klucza głównego
if ($primaryKey = $table->getPrimaryKey()) {
echo "Primary key: " . $printColumnNames($primaryKey->columns) . "\n";
}
Klucze obce
getForeignKeys(): Nette\Database\Reflection\ForeignKey[]
Zwraca tablicę obiektów Nette\Database\Reflection\ForeignKey
reprezentujących klucze obce tabeli.
getForeignKey(string $name): Nette\Database\Reflection\ForeignKey
Zwraca obiekt Nette\Database\Reflection\ForeignKey
reprezentujący dany klucz obcy. Jeśli klucz obcy nie istnieje, zgłaszany jest wyjątek
Nette\Database\Exception\MissingForeignKeyException
.
Obiekt ForeignKey
udostępnia następujące właściwości:
name
: Nazwa klucza obcego.localColumns
: Tablica obiektówNette\Database\Reflection\Column
reprezentujących lokalne kolumny, które tworzą klucz obcy.foreignTable
: ObiektNette\Database\Reflection\Table
reprezentujący tabelę obcą, do której odwołuje się klucz obcy.foreignColumns
: Tablica obiektówNette\Database\Reflection\Column
reprezentujących kolumny obce, do których odwołuje się klucz obcy.
$table = $reflection->getTable('books');
$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));
foreach ($table->getForeignKeys() as $fk) {
echo "Foreign key: " . ($fk->name ?? 'Unnamed') . "\n";
echo "Local columns: " . $printColumnNames($fk->localColumns) . "\n";
echo "References table: {$fk->foreignTable->name}\n";
echo "References columns: " . $printColumnNames($fk->foreignColumns) . "\n";
}