Reflexe
O Nette Database fornece ferramentas para introspecção da estrutura do banco de dados usando a classe Nette\Database\Reflection\Reflection. Isso permite que você recupere informações sobre tabelas, colunas, índices e chaves estrangeiras. A reflexão pode ser usada para geração de esquemas, criação de aplicativos flexíveis orientados por banco de dados ou ferramentas gerais de banco de dados.
Você pode obter o objeto de reflexão de uma instância de conexão de banco de dados:
$reflection = $connection->getReflection();
Trabalho com tabelas
Usando a reflexão, podemos navegar por todas as tabelas do banco de dados:
getTables(): Nette\Database\Reflection\Table[]
Retorna uma matriz associativa em que a chave é o nome da tabela e o valor é uma matriz de metadados da tabela.
// Listagem de todos os nomes de tabelas
foreach ($reflection->getTables() as $table) {
echo $table['name'] . "\n";
}
hasTable (string $name): bool
Retorna true
se a tabela existir, caso contrário, retorna false
.
// Verificação da existência da tabela
if ($reflection->hasTable('users')) {
echo "The 'users' table exists";
}
getTable (string $name): Nette\Database\Reflection\Table
Retorna o objeto Nette\Database\Reflection\Table
que representa a tabela fornecida. Se a tabela não existir, ele
lança uma exceção Nette\Database\Exception\MissingTableException
.
// Recuperação de uma tabela específica
$table = $reflection->getTable('users');
Informações sobre colunas
O objeto Nette\Database\Reflection\Table, obtido pela
chamada de getTable()
, permite recuperar informações detalhadas sobre as colunas da tabela.
getColumns(): Nette\Database\Reflection\Column[]
Retorna uma matriz de objetos Nette\Database\Reflection\Column
que representam as colunas da tabela.
getColumn (string $name): Nette\Database\Reflection\Column
Retorna o objeto Nette\Database\Reflection\Column que
representa a coluna fornecida. Se a coluna não existir, ele lança uma exceção
Nette\Database\Exception\MissingColumnException
.
O objeto Column
fornece as seguintes propriedades:
name
: O nome da coluna.nativeType
: O tipo de dados da coluna específico do banco de dados.type
: O tipo de dados normalizado da coluna (consulte as constantesNette\Utils\Type
).nullable
:true
se a coluna puder conterNULL
, caso contrário,false
.primary
:true
se a coluna fizer parte da chave primária, caso contrário,false
.autoIncrement
:true
se a coluna for autoincrementada, caso contrário,false
.default
: O valor padrão da coluna ounull
se não estiver definido.vendor
: Uma matriz com informações adicionais específicas do banco de dados.
// Iteração por todas as colunas da tabela "users".
$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";
}
// Recuperação de uma coluna específica
$idColumn = $table->getColumn('id');
Índices e chaves primárias
getIndexes(): Nette\Database\Reflection\Index[]
Retorna uma matriz de objetos Nette\Database\Reflection\Index
que representam os índices da tabela.
getIndex (string $name): Nette\Database\Reflection\Index
Retorna o objeto Nette\Database\Reflection\Index que
representa o índice fornecido. Se o índice não existir, ele lança uma exceção
Nette\Database\Exception\MissingIndexException
.
getPrimaryKey(): ?Nette\Database\Reflection\Index
Retorna o objeto Nette\Database\Reflection\Index
que representa a chave primária da tabela ou null
se a tabela não tiver chave primária.
O objeto Index
fornece as seguintes propriedades:
name
: O nome do índice.columns
: Uma matriz de objetosNette\Database\Reflection\Column
que representam as colunas que fazem parte do índice.unique
:true
se o índice for exclusivo, caso contrário,false
.primary
:true
se o índice for a chave primária, caso contrário,false
.
$table = $reflection->getTable('users');
$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));
// Listar todos os índices
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";
}
// Recuperação da chave primária
if ($primaryKey = $table->getPrimaryKey()) {
echo "Primary key: " . $printColumnNames($primaryKey->columns) . "\n";
}
Chaves estrangeiras
getForeignKeys(): Nette\Database\Reflection\ForeignKey[]
Retorna uma matriz de objetos Nette\Database\Reflection\ForeignKey
que representam as chaves estrangeiras da
tabela.
getForeignKey (string $name): Nette\Database\Reflection\ForeignKey
Retorna o objeto Nette\Database\Reflection\ForeignKey
que representa a chave estrangeira fornecida. Se a chave estrangeira não existir, ele lança uma exceção
Nette\Database\Exception\MissingForeignKeyException
.
O objeto ForeignKey
fornece as seguintes propriedades:
name
: O nome da chave estrangeira.localColumns
: Uma matriz de objetosNette\Database\Reflection\Column
que representa as colunas locais que compõem a chave estrangeira.foreignTable
: Um objetoNette\Database\Reflection\Table
que representa a tabela estrangeira à qual a chave estrangeira faz referência.foreignColumns
: Uma matriz de objetosNette\Database\Reflection\Column
que representam as colunas estrangeiras às quais a chave estrangeira faz referência.
$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";
}