Refleksija strukture

Nette Database ponuja orodja za introspekcijo strukture baze podatkov z uporabo razreda Nette\Database\Reflection. Ta omogoča pridobivanje informacij o tabelah, stolpcih, indeksih in tujih ključih. Refleksijo lahko uporabite za generiranje shem, ustvarjanje fleksibilnih aplikacij, ki delajo z bazo podatkov, ali splošnih orodij za baze podatkov.

Objekt refleksije pridobimo iz instance povezave z bazo podatkov:

$reflection = $database->getReflection();

Pridobivanje tabel

Readonly lastnost $reflection->tables vsebuje asociativno polje vseh tabel v bazi podatkov:

// Izpis imen vseh tabel
foreach ($reflection->tables as $name => $table) {
	echo $name . "\n";
}

Na voljo sta še dve metodi:

// Preverjanje obstoja tabele
if ($reflection->hasTable('users')) {
	echo "Tabela users obstaja";
}

// Vrne objekt tabele; če ne obstaja, vrže izjemo
$table = $reflection->getTable('users');

Informacije o tabeli

Tabela je predstavljena z objektom Table, ki ponuja naslednje readonly lastnosti:

  • $name: string – ime tabele
  • $view: bool – ali gre za pogled (view)
  • $fullName: ?string – polno ime tabele, vključno s shemo (če obstaja)
  • $columns: array<string, Column> – asociativno polje stolpcev tabele
  • $indexes: Index[] – polje indeksov tabele
  • $primaryKey: ?Index – primarni ključ tabele ali null
  • $foreignKeys: ForeignKey[] – polje tujih ključev tabele

Stolpci

Lastnost columns tabele ponuja asociativno polje stolpcev, kjer je ključ ime stolpca in vrednost instanca Column s temi lastnostmi:

  • $name: string – ime stolpca
  • $table: ?Table – referenca na tabelo stolpca
  • $nativeType: string – nativni podatkovni tip baze podatkov
  • $size: ?int – velikost/dolžina tipa
  • $nullable: bool – ali lahko stolpec vsebuje NULL
  • $default: mixed – privzeta vrednost stolpca
  • $autoIncrement: bool – ali je stolpec auto-increment
  • $primary: bool – ali je del primarnega ključa
  • $vendor: array – dodatni metapodatki, specifični za dani sistem baze podatkov
foreach ($table->columns as $name => $column) {
	echo "Stolpec: $name\n";
	echo "Tip: {$column->nativeType}\n";
	echo "Nullable: " . ($column->nullable ? 'Da' : 'Ne') . "\n";
}

Indeksi

Lastnost indexes tabele ponuja polje indeksov, kjer je vsak indeks instanca Index s temi lastnostmi:

  • $columns: Column[] – polje stolpcev, ki tvorijo indeks
  • $unique: bool – ali je indeks unikaten
  • $primary: bool – ali gre za primarni ključ
  • $name: ?string – ime indeksa

Primarni ključ tabele lahko pridobimo z lastnostjo primaryKey, ki vrne bodisi objekt Index ali null v primeru, da tabela nima primarnega ključa.

// Izpis indeksov
foreach ($table->indexes as $index) {
	$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
	echo "Indeks" . ($index->name ? " {$index->name}" : '') . ":\n";
	echo "  Stolpci: $columns\n";
	echo "  Unique: " . ($index->unique ? 'Da' : 'Ne') . "\n";
}

// Izpis primarnega ključa
if ($primaryKey = $table->primaryKey) {
	$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
	echo "Primarni ključ: $columns\n";
}

Tuji ključi

Lastnost foreignKeys tabele ponuja polje tujih ključev, kjer je vsak tuji ključ instanca ForeignKey s temi lastnostmi:

  • $foreignTable: Table – referencirana tabela
  • $localColumns: Column[] – polje lokalnih stolpcev
  • $foreignColumns: Column[] – polje referenciranih stolpcev
  • $name: ?string – ime tujega ključa
// Izpis tujih ključev
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";
}
različica: 4.0