Reflexe
Nette Database proporciona herramientas para la introspección de la estructura de la base de datos utilizando la clase Nette\Database\Reflection\Reflection. Esto permite recuperar información sobre tablas, columnas, índices y claves externas. Reflection puede utilizarse para generar esquemas, crear aplicaciones flexibles basadas en bases de datos o herramientas generales de bases de datos.
Puede obtener el objeto reflection a partir de una instancia de conexión a una base de datos:
$reflection = $connection->getReflection();
Trabajar con tablas
Usando reflection podemos navegar por todas las tablas de la base de datos:
getTables(): Nette\Database\Reflection\Table[]
Devuelve un array asociativo donde la clave es el nombre de la tabla, y el valor es un array de metadatos de la tabla.
// Listado de todos los nombres de tabla
foreach ($reflection->getTables() as $table) {
echo $table['name'] . "\n";
}
hasTable (string $name): bool
Devuelve true
si la tabla existe, en caso contrario false
.
// Comprobación de la existencia de una tabla
if ($reflection->hasTable('users')) {
echo "The 'users' table exists";
}
getTable (string $name): Nette\Database\Reflection\Table
Devuelve el objeto Nette\Database\Reflection\Table
que representa la tabla dada. Si la tabla no existe, lanza una
excepción Nette\Database\Exception\MissingTableException
.
// Recuperar una tabla específica
$table = $reflection->getTable('users');
Información sobre columnas
El objeto Nette\Database\Reflection\Table, que se
obtiene llamando a getTable()
, permite recuperar información detallada sobre las columnas de la tabla.
getColumns(): Nette\Database\Reflection\Column[]
Devuelve una matriz de objetos Nette\Database\Reflection\Column
que representan las columnas de la tabla.
getColumn (string $name): Nette\Database\Reflection\Column
Devuelve el objeto Nette\Database\Reflection\Column que
representa la columna dada. Si la columna no existe, lanza una excepción
Nette\Database\Exception\MissingColumnException
.
El objeto Column
proporciona las siguientes propiedades:
name
: El nombre de la columna.nativeType
: El tipo de datos de la columna específico de la base de datos.type
: El tipo de datos normalizado de la columna (véanse las constantesNette\Utils\Type
).nullable
:true
si la columna puede contenerNULL
, en caso contrariofalse
.primary
:true
si la columna forma parte de la clave primaria, en caso contrariofalse
.autoIncrement
:true
si la columna es autoincremental, en caso contrariofalse
.default
: El valor por defecto de la columna, onull
si no está definido.vendor
: Una matriz con información adicional específica de la base de datos.
// Recorrer todas las columnas de la tabla "usuarios
$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";
}
// Recuperación de una columna específica
$idColumn = $table->getColumn('id');
Índices y claves primarias
getIndexes(): Nette\Database\Reflection\Index[]
Devuelve una matriz de objetos Nette\Database\Reflection\Index
que representan los índices de la tabla.
getIndex (string $name): Nette\Database\Reflection\Index
Devuelve el objeto Nette\Database\Reflection\Index que
representa el índice dado. Si el índice no existe, lanza una excepción
Nette\Database\Exception\MissingIndexException
.
getPrimaryKey(): ?Nette\Database\Reflection\Index
Devuelve el objeto Nette\Database\Reflection\Index
que representa la clave primaria de la tabla, o
null
si la tabla no tiene clave primaria.
El objeto Index
proporciona las siguientes propiedades:
name
: El nombre del índice.columns
: Una matriz de objetosNette\Database\Reflection\Column
que representan las columnas que forman parte del índice.unique
:true
si el índice es único, en caso contrariofalse
.primary
:true
si el índice es la clave primaria, en caso contrariofalse
.
$table = $reflection->getTable('users');
$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));
// Listado de todos los í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";
}
// Recuperación de la clave primaria
if ($primaryKey = $table->getPrimaryKey()) {
echo "Primary key: " . $printColumnNames($primaryKey->columns) . "\n";
}
Claves externas
getForeignKeys(): Nette\Database\Reflection\ForeignKey[]
Devuelve una matriz de objetos Nette\Database\Reflection\ForeignKey
que representan las claves externas de
la tabla.
getForeignKey (string $name): Nette\Database\Reflection\ForeignKey
Devuelve el objeto Nette\Database\Reflection\ForeignKey
que representa la clave ajena dada. Si la clave ajena no existe, lanza una excepción
Nette\Database\Exception\MissingForeignKeyException
.
El objeto ForeignKey
proporciona las siguientes propiedades:
name
: El nombre de la clave foránea.localColumns
: Un array de objetosNette\Database\Reflection\Column
que representan las columnas locales que componen la clave foránea.foreignTable
: Un objetoNette\Database\Reflection\Table
que representa la tabla externa a la que hace referencia la clave externa.foreignColumns
: Un array de objetosNette\Database\Reflection\Column
que representan las columnas foráneas a las que hace referencia la clave foránea.
$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";
}