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";
}
wersja: 4.x