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łe Nette\Utils\Type).
  • nullable: true jeśli kolumna może zawierać NULL, w przeciwnym razie false.
  • primary: true jeśli kolumna jest częścią klucza głównego, w przeciwnym razie false.
  • autoIncrement: true jeśli kolumna jest automatycznie zwiększana, w przeciwnym razie false.
  • default: Wartość domyślna kolumny lub null, 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ów Nette\Database\Reflection\Column reprezentujących kolumny, które są częścią indeksu.
  • unique: true jeśli indeks jest unikalny, w przeciwnym razie false.
  • primary: true jeśli indeks jest kluczem podstawowym, w przeciwnym razie false.
$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ów Nette\Database\Reflection\Column reprezentujących lokalne kolumny, które tworzą klucz obcy.
  • foreignTable: Obiekt Nette\Database\Reflection\Table reprezentujący tabelę obcą, do której odwołuje się klucz obcy.
  • foreignColumns: Tablica obiektów Nette\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";
}
wersja: 4.0