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');
Informacje o tabeli
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";
}