Reflexão da estrutura
Nette Database fornece ferramentas para introspecção da estrutura do banco de dados usando a classe Nette\Database\Reflection. Ela permite obter informações sobre tabelas, colunas, índices e chaves estrangeiras. Você pode usar a reflexão para gerar esquemas, criar aplicações flexíveis que trabalham com o banco de dados ou ferramentas gerais de banco de dados.
Obtemos o objeto de reflexão da instância de conexão com o banco de dados:
$reflection = $database->getReflection();
Obtenção de tabelas
A propriedade readonly $reflection->tables
contém um array associativo de todas as tabelas no banco
de dados:
// Listagem dos nomes de todas as tabelas
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Existem mais dois métodos disponíveis:
// Verificação da existência da tabela
if ($reflection->hasTable('users')) {
echo "A tabela users existe";
}
// Retorna o objeto da tabela; se não existir, lança uma exceção
$table = $reflection->getTable('users');
Informações sobre a tabela
A tabela é representada pelo objeto Table, que fornece as seguintes propriedades readonly:
$name: string
– nome da tabela$view: bool
– se é uma view$fullName: ?string
– nome completo da tabela incluindo o esquema (se existir)$columns: array<string, Column>
– array associativo das colunas da tabela$indexes: Index[]
– array de índices da tabela$primaryKey: ?Index
– chave primária da tabela ou null$foreignKeys: ForeignKey[]
– array de chaves estrangeiras da tabela
Colunas
A propriedade columns
da tabela fornece um array associativo de colunas, onde a chave é o nome da coluna e
o valor é uma instância de Column com
estas propriedades:
$name: string
– nome da coluna$table: ?Table
– referência à tabela da coluna$nativeType: string
– tipo de dados nativo do banco de dados$size: ?int
– tamanho/comprimento do tipo$nullable: bool
– se a coluna pode conter NULL$default: mixed
– valor padrão da coluna$autoIncrement: bool
– se a coluna é auto-increment$primary: bool
– se faz parte da chave primária$vendor: array
– metadados adicionais específicos do sistema de banco de dados
foreach ($table->columns as $name => $column) {
echo "Coluna: $name\n";
echo "Tipo: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Sim' : 'Não') . "\n";
}
Índices
A propriedade indexes
da tabela fornece um array de índices, onde cada índice é uma instância de Index com estas propriedades:
$columns: Column[]
– array de colunas que formam o índice$unique: bool
– se o índice é único$primary: bool
– se é a chave primária$name: ?string
– nome do índice
A chave primária da tabela pode ser obtida usando a propriedade primaryKey
, que retorna ou um objeto
Index
, ou null
caso a tabela não tenha chave primária.
// Listagem de índices
foreach ($table->indexes as $index) {
$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
echo "Índice" . ($index->name ? " {$index->name}" : '') . ":\n";
echo " Colunas: $columns\n";
echo " Unique: " . ($index->unique ? 'Sim' : 'Não') . "\n";
}
// Listagem da chave primária
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Chave primária: $columns\n";
}
Chaves estrangeiras
A propriedade foreignKeys
da tabela fornece um array de chaves estrangeiras, onde cada chave estrangeira é uma
instância de ForeignKey com estas
propriedades:
$foreignTable: Table
– tabela referenciada$localColumns: Column[]
– array de colunas locais$foreignColumns: Column[]
– array de colunas referenciadas$name: ?string
– nome da chave estrangeira
// Listagem de chaves estrangeiras
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";
}