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 oppure null
  • $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ò contenere NULL
  • $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";
}
versione: 4.0