Reflectarea structurii
Nette Database oferă instrumente pentru inspectarea structurilor bazelor de date prin clasa Nette\Database\Reflection. Aceasta vă permite să obțineți informații despre tabele, coloane, indexuri și chei străine. Puteți utiliza reflecția pentru a genera scheme, a crea aplicații flexibile de baze de date sau a construi instrumente generale de baze de date.
Puteți obține obiectul reflection dintr-o instanță de conexiune la o bază de date:
$reflection = $database->getReflection();
Recuperarea tabelelor
Proprietatea readonly $reflection->tables
oferă un array asociativ al tuturor tabelelor din baza de date:
// Listarea numelor tuturor tabelelor
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Există două metode suplimentare disponibile:
// Verifică dacă un tabel există
if ($reflection->hasTable('users')) {
echo "The table 'users' exists.";
}
// Recuperează un obiect tabel; aruncă o excepție dacă acesta nu există
$table = $reflection->getTable('users');
Informații despre masă
Un tabel este reprezentat de obiectul Table, care oferă următoarele proprietăți de tip readonly:
$name: string
– numele tabelului$view: bool
– dacă este o vizualizare$fullName: ?string
– numele complet al tabelului, inclusiv schema (dacă este cazul)$columns: array<string, Column>
– o matrice asociativă a coloanelor tabelului$indexes: Index[]
– o serie de indici ai tabelului$primaryKey: ?Index
– cheia primară a tabelului saunull
$foreignKeys: ForeignKey[]
– o matrice a cheilor străine ale tabelului
Coloane
Proprietatea columns
a unui tabel oferă o matrice asociativă de coloane, în care cheia este numele coloanei,
iar valoarea este o instanță a Column
cu următoarele proprietăți:
$name: string
– numele coloanei$table: ?Table
– o referință la tabelul coloanei$nativeType: string
– tipul nativ al bazei de date$size: ?int
– dimensiunea/lungimea tipului$nullable: bool
– dacă coloana poate conțineNULL
$default: mixed
– valoarea implicită a coloanei$autoIncrement: bool
– dacă coloana este auto-incrementată$primary: bool
– dacă coloana face parte din cheia primară$vendor: array
– metadate suplimentare specifice sistemului de baze de date
foreach ($table->columns as $name => $column) {
echo "Column: $name\n";
echo "Type: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Yes' : 'No') . "\n";
}
Indexuri
Proprietatea indexes
a unui tabel conține o serie de indexuri, unde fiecare index este o instanță de Index cu următoarele proprietăți:
$columns: Column[]
– o matrice de coloane care alcătuiesc indexul$unique: bool
– dacă indexul este unic$primary: bool
– dacă este o cheie primară$name: ?string
– numele indexului
Cheia primară a unui tabel poate fi accesată prin intermediul proprietății primaryKey
, care returnează un
obiect Index
sau null
dacă tabelul nu are una.
// Listarea indicilor
foreach ($table->indexes as $index) {
$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
echo "Index" . ($index->name ? " {$index->name}": '') . ":\n";
echo " Columns: $columns\n";
echo " Unique: " . ($index->unique ? 'Yes': 'No') . "\n";
}
// Afișarea cheii primare
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Primary Key: $columns\n";
}
Chei străine
Proprietatea foreignKeys
a unui tabel conține o serie de chei străine, fiecare reprezentată ca o instanță
de ForeignKey cu următoarele
proprietăți:
$foreignTable: Table
– tabelul la care se face referire$localColumns: Column[]
– o serie de coloane locale$foreignColumns: Column[]
– o serie de coloane de referință$name: ?string
– numele cheii străine
// Listarea cheilor străine
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";
}