Riflessione della struttura
Nette Database fornisce strumenti per l'introspezione della struttura del database utilizzando la classe Nette\Database\Reflection. Ciò consente di ottenere informazioni su tabelle, colonne, indici e chiavi esterne. È possibile utilizzare la riflessione per generare schemi, creare applicazioni flessibili che lavorano con il database o strumenti di database generici.
Otteniamo l'oggetto di riflessione dall'istanza della connessione al database:
$reflection = $database->getReflection();
Ottenere le tabelle
La proprietà readonly $reflection->tables contiene un array associativo di tutte le tabelle nel database:
// Elenca i nomi di tutte le tabelle
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Sono disponibili anche due metodi:
// Verifica l'esistenza della tabella
if ($reflection->hasTable('users')) {
echo "La tabella users esiste";
}
// Restituisce l'oggetto tabella; se non esiste, lancia un'eccezione
$table = $reflection->getTable('users');
Informazioni sulla tabella
La tabella è rappresentata dall'oggetto Table, che fornisce le seguenti proprietà readonly:
$name: string– nome della tabella$view: bool– se si tratta di una vista$fullName: ?string– nome completo della tabella incluso lo schema (se esiste)$columns: array<string, Column>– array associativo delle colonne della tabella$indexes: Index[]– array degli indici della tabella$primaryKey: ?Index– chiave primaria della tabella o null$foreignKeys: ForeignKey[]– array delle chiavi esterne della tabella
Colonne
La proprietà columns della tabella fornisce un array associativo di colonne, dove la chiave è il nome della
colonna e il valore è un'istanza di Column con queste proprietà:
$name: string– nome della colonna$table: ?Table– riferimento alla tabella della colonna$nativeType: string– tipo di dato nativo del database$size: ?int– dimensione/lunghezza del tipo$nullable: bool– se la colonna può contenere NULL$default: mixed– valore predefinito della colonna$autoIncrement: bool– se la colonna è auto-increment$primary: bool– se fa parte della chiave primaria$vendor: array– metadati aggiuntivi specifici per il sistema di database dato
foreach ($table->columns as $name => $column) {
echo "Colonna: $name\n";
echo "Tipo: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Sì' : 'No') . "\n";
}
Indici
La proprietà indexes della tabella fornisce un array di indici, dove ogni indice è un'istanza di Index con queste proprietà:
$columns: Column[]– array di colonne che compongono l'indice$unique: bool– se l'indice è univoco$primary: bool– se è una chiave primaria$name: ?string– nome dell'indice
La chiave primaria della tabella può essere ottenuta utilizzando la proprietà primaryKey, che restituisce un
oggetto Index o null nel caso in cui la tabella non abbia una chiave primaria.
// Elenco degli indici
foreach ($table->indexes as $index) {
$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
echo "Indice" . ($index->name ? " {$index->name}" : '') . ":\n";
echo " Colonne: $columns\n";
echo " Unique: " . ($index->unique ? 'Sì' : 'No') . "\n";
}
// Elenco della chiave primaria
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Chiave primaria: $columns\n";
}
Chiavi esterne
La proprietà foreignKeys della tabella fornisce un array di chiavi esterne, dove ogni chiave esterna è
un'istanza di ForeignKey con queste
proprietà:
$foreignTable: Table– tabella referenziata$localColumns: Column[]– array di colonne locali$foreignColumns: Column[]– array di colonne referenziate$name: ?string– nome della chiave esterna
// Elenco delle chiavi esterne
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";
}