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";
}
versão: 4.0