Odbicie struktury
Nette Database zapewnia narzędzia do inspekcji struktur baz danych poprzez klasę Nette\Database\Reflection. Pozwala to na pobieranie informacji o tabelach, kolumnach, indeksach i kluczach obcych. Refleksji można używać do generowania schematów, tworzenia elastycznych aplikacji bazodanowych lub budowania ogólnych narzędzi bazodanowych.
Obiekt refleksji można uzyskać z instancji połączenia z bazą danych:
$reflection = $database->getReflection();
Pobieranie tabel
Właściwość readonly $reflection->tables
udostępnia tablicę asocjacyjną wszystkich tabel w bazie
danych:
// Wyświetlanie nazw wszystkich tabel
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Dostępne są dwie dodatkowe metody:
// Sprawdza, czy tabela istnieje
if ($reflection->hasTable('users')) {
echo "The table 'users' exists.";
}
// Pobiera obiekt tabeli; rzuca wyjątek, jeśli nie istnieje.
$table = $reflection->getTable('users');
Informacje o tabeli
Tabela jest reprezentowana przez obiekt Table, który udostępnia następujące właściwości tylko do odczytu:
$name: string
– nazwa tabeli$view: bool
– czy jest to widok$fullName: ?string
– pełna nazwa tabeli, w tym schemat (jeśli dotyczy)$columns: array<string, Column>
– tablica asocjacyjna kolumn tabeli$indexes: Index[]
– tablica indeksów tabeli$primaryKey: ?Index
– klucz podstawowy tabeli lubnull
$foreignKeys: ForeignKey[]
– tablica kluczy obcych tabeli
Kolumny
Właściwość columns
tabeli zapewnia asocjacyjną tablicę kolumn, gdzie kluczem jest nazwa kolumny, a
wartością jest instancja Column
z następującymi właściwościami:
$name: string
– nazwa kolumny$table: ?Table
– odniesienie 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
– domyślna wartość kolumny$autoIncrement: bool
– czy kolumna jest automatycznie zwiększana$primary: bool
– czy kolumna jest częścią klucza głównego$vendor: array
– dodatkowe metadane specyficzne dla systemu bazy danych
foreach ($table->columns as $name => $column) {
echo "Column: $name\n";
echo "Type: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Yes' : 'No') . "\n";
}
Indeksy
Właściwość indexes
tabeli zawiera tablicę indeksów, gdzie każdy indeks jest instancją indeksu o następujących
właściwościach:
$columns: Column[]
– tablica kolumn tworzących indeks$unique: bool
– czy indeks jest unikalny$primary: bool
– czy jest to klucz podstawowy$name: ?string
– nazwa indeksu
Dostęp do klucza głównego tabeli można uzyskać za pośrednictwem właściwości primaryKey
, która zwraca
obiekt Index
lub null
, jeśli tabela go nie posiada.
// Wyświetlanie indeksów
foreach ($table->indexes as $index) {
$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
echo "Index" . ($index->name ? " {$index->name}": '') . ":\n";
echo " Columns: $columns\n";
echo " Unique: " . ($index->unique ? 'Yes': 'No') . "\n";
}
// Wyświetlanie klucza głównego
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Primary Key: $columns\n";
}
Klucze obce
Właściwość foreignKeys
tabeli zawiera tablicę kluczy obcych, z których każdy jest reprezentowany jako
instancja ForeignKey
o następujących właściwościach:
$foreignTable: Table
– tabela, do której się odwołujemy$localColumns: Column[]
– tablica lokalnych kolumn$foreignColumns: Column[]
– tablica odwołujących się kolumn$name: ?string
– nazwa klucza obcego
// Listowanie 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";
}