Riflessi
Nette Database fornisce strumenti per l'introspezione della struttura del database utilizzando la classe Nette\Database\Reflection\Reflection. Questa permette di recuperare informazioni su tabelle, colonne, indici e chiavi esterne. La riflessione può essere utilizzata per la generazione di schemi, per la creazione di applicazioni flessibili basate su database o per strumenti generali di database.
È possibile ottenere l'oggetto reflection da un'istanza di connessione al database:
$reflection = $connection->getReflection();
Lavorare con le tabelle
Utilizzando la riflessione possiamo sfogliare tutte le tabelle del database:
getTables(): Nette\Database\Reflection\Table[]
Restituisce un array associativo in cui la chiave è il nome della tabella e il valore è un array di metadati della tabella.
// Elenco di tutti i nomi delle tabelle
foreach ($reflection->getTables() as $table) {
echo $table['name'] . "\n";
}
hasTable(string $name): bool
Restituisce true
se la tabella esiste, altrimenti false
.
// Verifica dell'esistenza della tabella
if ($reflection->hasTable('users')) {
echo "The 'users' table exists";
}
getTable(string $name): Nette\Database\Reflection\Table
Restituisce l'oggetto Nette\Database\Reflection\Table
che rappresenta la tabella indicata. Se la tabella non
esiste, lancia un'eccezione Nette\Database\Exception\MissingTableException
.
// Recupero di una tabella specifica
$table = $reflection->getTable('users');
Informazioni sulle colonne
L'oggetto Nette\Database\Reflection\Table, ottenuto
chiamando getTable()
, consente di recuperare informazioni dettagliate sulle colonne della tabella.
getColumns(): Nette\Database\Reflection\Column[]
Restituisce un array di oggetti Nette\Database\Reflection\Column
che rappresentano le colonne della tabella.
getColumn(string $name): Nette\Database\Reflection\Column
Restituisce l'oggetto Nette\Database\Reflection\Column che
rappresenta la colonna indicata. Se la colonna non esiste, lancia un'eccezione
Nette\Database\Exception\MissingColumnException
.
L'oggetto Column
fornisce le seguenti proprietà:
name
: Il nome della colonna.nativeType
: Il tipo di dati della colonna specifico del database.type
: Il tipo di dati normalizzato della colonna (vedere le costantiNette\Utils\Type
).nullable
:true
se la colonna può contenereNULL
, altrimentifalse
.primary
:true
se la colonna fa parte della chiave primaria, altrimentifalse
.autoIncrement
:true
se la colonna è autoincrementata, altrimentifalse
.default
: Il valore predefinito della colonna onull
se non è definito.vendor
: Un array con informazioni aggiuntive specifiche del database.
// Iterazione di tutte le colonne della tabella "utenti".
$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";
}
// Recupero di una colonna specifica
$idColumn = $table->getColumn('id');
Indici e chiavi primarie
getIndexes(): Nette\Database\Reflection\Index[]
Restituisce un array di oggetti Nette\Database\Reflection\Index
che rappresentano gli indici della tabella.
getIndex(string $name): Nette\Database\Reflection\Index
Restituisce l'oggetto Nette\Database\Reflection\Index che rappresenta
l'indice dato. Se l'indice non esiste, lancia un'eccezione Nette\Database\Exception\MissingIndexException
.
getPrimaryKey(): ?Nette\Database\Reflection\Index
Restituisce l'oggetto Nette\Database\Reflection\Index
che rappresenta la chiave primaria della tabella, oppure
null
se la tabella non ha una chiave primaria.
L'oggetto Index
fornisce le seguenti proprietà:
name
: Il nome dell'indice.columns
: Un array di oggettiNette\Database\Reflection\Column
che rappresentano le colonne che fanno parte dell'indice.unique
:true
se l'indice è unico, altrimentifalse
.primary
:true
se l'indice è la chiave primaria, altrimentifalse
.
$table = $reflection->getTable('users');
$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));
// Elenco di tutti gli indici
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";
}
// Recupero della chiave primaria
if ($primaryKey = $table->getPrimaryKey()) {
echo "Primary key: " . $printColumnNames($primaryKey->columns) . "\n";
}
Chiavi straniere
getForeignKeys(): Nette\Database\Reflection\ForeignKey[]
Restituisce un array di oggetti Nette\Database\Reflection\ForeignKey
che rappresentano le chiavi esterne della
tabella.
getForeignKey(string $name): Nette\Database\Reflection\ForeignKey
Restituisce l'oggetto Nette\Database\Reflection\ForeignKey che
rappresenta la chiave esterna indicata. Se la chiave esterna non esiste, viene lanciata un'eccezione
Nette\Database\Exception\MissingForeignKeyException
.
L'oggetto ForeignKey
fornisce le seguenti proprietà:
name
: il nome della chiave esterna.localColumns
: Un array di oggettiNette\Database\Reflection\Column
che rappresentano le colonne locali che compongono la chiave esterna.foreignTable
: Un oggettoNette\Database\Reflection\Table
che rappresenta la tabella esterna a cui fa riferimento la chiave esterna.foreignColumns
: Una matrice di oggettiNette\Database\Reflection\Column
che rappresentano le colonne esterne a cui fa riferimento la chiave esterna.
$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";
}