Riflessione della struttura
Nette Database fornisce strumenti per ispezionare le strutture dei database attraverso la classe Nette\Database\Reflection. Ciò consente di recuperare informazioni su tabelle, colonne, indici e chiavi esterne. È possibile utilizzare la riflessione per generare schemi, creare applicazioni di database flessibili o costruire strumenti generali per i database.
È possibile ottenere l'oggetto reflection da un'istanza di connessione al database:
$reflection = $database->getReflection();
Recupero delle tabelle
La proprietà readonly $reflection->tables
fornisce un array associativo di tutte le tabelle del database:
// Elenco dei nomi di tutte le tabelle
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Sono disponibili due metodi aggiuntivi:
// Controllare se una tabella esiste
if ($reflection->hasTable('users')) {
echo "The table 'users' exists.";
}
// Recupera un oggetto tabella; se non esiste, lancia un'eccezione.
$table = $reflection->getTable('users');
Informazioni sulla tabella
Una tabella è rappresentata dall'oggetto Table, che fornisce le seguenti proprietà di sola lettura:
$name: string
– il nome della tabella$view: bool
– se si tratta di una vista$fullName: ?string
– il nome completo della tabella, compreso lo schema (se applicabile)$columns: array<string, Column>
– un array associativo delle colonne della tabella$indexes: Index[]
– un array di indici della tabella$primaryKey: ?Index
– la chiave primaria della tabella oppurenull
$foreignKeys: ForeignKey[]
– un array di chiavi esterne della tabella
Colonne
La proprietà columns
di una tabella fornisce un array associativo di colonne, dove la chiave è il nome della
colonna e il valore è un'istanza di Column con le seguenti proprietà:
$name: string
– il nome della colonna$table: ?Table
– un riferimento alla tabella della colonna$nativeType: string
– il tipo di database nativo$size: ?int
– la dimensione/lunghezza del tipo$nullable: bool
– se la colonna può contenereNULL
$default: mixed
– il valore predefinito della colonna$autoIncrement: bool
– se la colonna viene incrementata automaticamente$primary: bool
– se la colonna fa parte della chiave primaria$vendor: array
– metadati aggiuntivi specifici del sistema di database
foreach ($table->columns as $name => $column) {
echo "Column: $name\n";
echo "Type: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Yes' : 'No') . "\n";
}
Indici
La proprietà indexes
di una tabella contiene un array di indici, dove ogni indice è un'istanza di Index con le seguenti proprietà:
$columns: Column[]
– un array di colonne che compongono l'indice$unique: bool
– se l'indice è unico$primary: bool
– se è una chiave primaria$name: ?string
– il nome dell'indice
È possibile accedere alla chiave primaria di una tabella tramite la proprietà primaryKey
, che restituisce un
oggetto Index
o null
se la tabella non ne ha uno.
// Elencare gli indici
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";
}
// Visualizzazione della chiave primaria
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Primary Key: $columns\n";
}
Chiavi straniere
La proprietà foreignKeys
di una tabella contiene un array di chiavi esterne, ciascuna rappresentata come istanza
di ForeignKey con le seguenti
proprietà:
$foreignTable: Table
– la tabella di riferimento$localColumns: Column[]
– un array di colonne locali$foreignColumns: Column[]
– un array di colonne di riferimento$name: ?string
– il nome della chiave esterna
// Elencare le chiavi straniere
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";
}