Reflexo da estrutura

O Nette Database fornece ferramentas para inspecionar estruturas de banco de dados por meio da classe Nette\Database\Reflection. Isso permite que você recupere informações sobre tabelas, colunas, índices e chaves estrangeiras. Você pode usar a reflexão para gerar esquemas, criar aplicativos de banco de dados flexíveis ou criar ferramentas gerais de banco de dados.

É possível obter o objeto de reflexão de uma instância de conexão de banco de dados:

$reflection = $database->getReflection();

Recuperação de tabelas

A propriedade readonly $reflection->tables fornece uma matriz associativa de todas as tabelas do banco de dados:

// Listagem dos nomes de todas as tabelas
foreach ($reflection->tables as $name => $table) {
	echo $name . "\n";
}

Há dois métodos adicionais disponíveis:

// Verificar se uma tabela existe
if ($reflection->hasTable('users')) {
	echo "The table 'users' exists.";
}

// Recuperar um objeto de tabela; lança uma exceção se ele não existir
$table = $reflection->getTable('users');

Informações sobre a tabela

Uma tabela é representada pelo objeto Table, que fornece as seguintes propriedades somente leitura:

  • $name: string – o nome da tabela
  • $view: bool – se ela é uma exibição
  • $fullName: ?string – o nome completo da tabela, incluindo o esquema (se aplicável)
  • $columns: array<string, Column> – uma matriz associativa das colunas da tabela
  • $indexes: Index[] – uma matriz dos índices da tabela
  • $primaryKey: ?Index – a chave primária da tabela ou null
  • $foreignKeys: ForeignKey[] – uma matriz das chaves estrangeiras da tabela

Colunas

A propriedade columns de uma tabela fornece uma matriz associativa de colunas, em que a chave é o nome da coluna e o valor é uma instância de Column com as seguintes propriedades:

  • $name: string – o nome da coluna
  • $table: ?Table – uma referência à tabela da coluna
  • $nativeType: string – o tipo de banco de dados nativo
  • $size: ?int – o tamanho/comprimento do tipo
  • $nullable: bool – se a coluna pode conter NULL
  • $default: mixed – o valor padrão da coluna
  • $autoIncrement: bool – se a coluna é auto-incrementada
  • $primary: bool – se a coluna 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 "Column: $name\n";
	echo "Type: {$column->nativeType}\n";
	echo "Nullable: " . ($column->nullable ? 'Yes' : 'No') . "\n";
}

Índices

A propriedade indexes de uma tabela contém uma matriz de índices, em que cada índice é uma instância de Index com as seguintes propriedades:

  • $columns: Column[] – uma matriz de colunas que compõem o índice
  • $unique: bool – se o índice é exclusivo
  • $primary: bool – se ele é uma chave primária
  • $name: ?string – o nome do índice

A chave primária de uma tabela pode ser acessada por meio da propriedade primaryKey, que retorna um objeto Index ou null se a tabela não tiver um.

// Listar índices
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";
}

// Exibindo a chave primária
if ($primaryKey = $table->primaryKey) {
	$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
	echo "Primary Key: $columns\n";
}

Chaves estrangeiras

A propriedade foreignKeys de uma tabela contém uma matriz de chaves estrangeiras, cada uma representada como uma instância de ForeignKey com as seguintes propriedades:

  • $foreignTable: Table – a tabela referenciada
  • $localColumns: Column[] – uma matriz de colunas locais
  • $foreignColumns: Column[] – uma matriz de colunas referenciadas
  • $name: ?string – o 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