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";
}