Reflexe
Podatkovna baza Nette zagotavlja orodja za introspekcijo strukture podatkovne baze z uporabo razreda Nette\Database\Reflection\Reflection. Ta omogoča pridobivanje informacij o tabelah, stolpcih, indeksih in tujih ključih. Refleksijo lahko uporabite za izdelavo sheme, ustvarjanje prilagodljivih aplikacij, ki temeljijo na podatkovni zbirki, ali splošnih orodij za podatkovne zbirke.
Objekt refleksije lahko pridobite iz primerka povezave s podatkovno bazo:
$reflection = $connection->getReflection();
Delo s tabelami
Z uporabo refleksije lahko pregledujemo vse tabele v zbirki podatkov:
getTables(): Nette\Database\Reflection\Table[]
Vrne asociativno polje, kjer je ključ ime tabele, vrednost pa polje metapodatkov tabele.
// Navedba vseh imen tabel
foreach ($reflection->getTables() as $table) {
echo $table['name'] . "\n";
}
hasTable(string $name): bool
Vrne true
, če tabela obstaja, sicer false
.
// Preverjanje obstoja tabele
if ($reflection->hasTable('users')) {
echo "The 'users' table exists";
}
getTable(string $name): Nette\Database\Reflection\Table
Vrne predmet Nette\Database\Reflection\Table
, ki predstavlja dano tabelo. Če tabela ne obstaja, vrže izjemo
Nette\Database\Exception\MissingTableException
.
// Pridobivanje določene tabele
$table = $reflection->getTable('users');
Informacije o stolpcih
Objekt Nette\Database\Reflection\Table,
ki ga dobite s klicem getTable()
, omogoča pridobitev podrobnih informacij o stolpcih tabele.
getColumns(): Nette\Database\Reflection\Column[]
Vrne polje objektov Nette\Database\Reflection\Column
, ki predstavljajo stolpce tabele.
getColumn(string $name): Nette\Database\Reflection\Column
Vrne objekt Nette\Database\Reflection\Column, ki
predstavlja dani stolpec. Če stolpec ne obstaja, vrže izjemo Nette\Database\Exception\MissingColumnException
.
Predmet Column
ima naslednje lastnosti:
name
: Ime stolpca.nativeType
: Podatkovni tip stolpca, specifičen za podatkovno zbirko.type
: Normalizirani podatkovni tip stolpca (glej konstanteNette\Utils\Type
).nullable
:true
, če stolpec lahko vsebujeNULL
, sicerfalse
.primary
:true
, če je stolpec del primarnega ključa, sicerfalse
.autoIncrement
:true
, če je stolpec samodejno povečan, sicerfalse
.default
: privzeta vrednost stolpca alinull
, če ni določena.vendor
: Polje z dodatnimi informacijami, značilnimi za podatkovno zbirko.
// Iteriranje po vseh stolpcih v 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";
}
// Pridobivanje določenega stolpca
$idColumn = $table->getColumn('id');
Indeksi in primarni ključi
getIndexes(): Nette\Database\Reflection\Index[]
Vrne polje objektov Nette\Database\Reflection\Index
, ki predstavljajo indekse tabel.
getIndex(string $name): Nette\Database\Reflection\Index
Vrne objekt Nette\Database\Reflection\Index, ki predstavlja
dani indeks. Če indeks ne obstaja, vrže izjemo Nette\Database\Exception\MissingIndexException
.
getPrimaryKey(): ?Nette\Database\Reflection\Index
Vrne predmet Nette\Database\Reflection\Index
, ki predstavlja primarni ključ tabele, ali null
, če
tabela nima primarnega ključa.
Predmet Index
ima naslednje lastnosti:
name
: Ime indeksa.columns
: Polje objektovNette\Database\Reflection\Column
, ki predstavljajo stolpce, ki so del indeksa.unique
:true
, če je indeks edinstven, sicerfalse
.primary
:true
, če je indeks primarni ključ, sicerfalse
.
$table = $reflection->getTable('users');
$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));
// Seznam vseh indeksov
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";
}
// Pridobitev primarnega ključa
if ($primaryKey = $table->getPrimaryKey()) {
echo "Primary key: " . $printColumnNames($primaryKey->columns) . "\n";
}
Tuji ključi
getForeignKeys(): Nette\Database\Reflection\ForeignKey[]
Vrne polje objektov Nette\Database\Reflection\ForeignKey
, ki predstavljajo tuje ključe tabele.
getForeignKey(string $name): Nette\Database\Reflection\ForeignKey
Vrne objekt Nette\Database\Reflection\ForeignKey, ki
predstavlja dani tuji ključ. Če tuji ključ ne obstaja, vrže izjemo
Nette\Database\Exception\MissingForeignKeyException
.
Predmet ForeignKey
ima naslednje lastnosti:
name
: Ime tujega ključa.localColumns
: Polje objektovNette\Database\Reflection\Column
, ki predstavljajo lokalne stolpce, ki sestavljajo tuji ključ.foreignTable
: ObjektNette\Database\Reflection\Table
, ki predstavlja tujo tabelo, na katero se sklicuje tuji ključ.foreignColumns
: PoljeNette\Database\Reflection\Column
objektov, ki predstavljajo tuje stolpce, na katere se sklicuje tuji ključ.
$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";
}