Reflexión de la estructura
Nette Database proporciona herramientas para la introspección de la estructura de la base de datos utilizando la clase Nette\Database\Reflection\Reflection. Permite obtener información sobre tablas, columnas, índices y claves foráneas. Puedes utilizar la reflexión para generar esquemas, crear aplicaciones flexibles que trabajen con la base de datos o herramientas generales de base de datos.
Obtenemos el objeto de reflexión de la instancia de conexión a la base de datos:
$reflection = $database->getReflection();
Obtención de tablas
La propiedad de solo lectura $reflection->tables contiene un array asociativo de todas las tablas en la base
de datos:
// Listado de nombres de todas las tablas
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
También hay dos métodos disponibles:
// Verificar la existencia de una tabla
if ($reflection->hasTable('users')) {
echo "La tabla users existe";
}
// Devuelve el objeto de la tabla; si no existe, lanza una excepción
$table = $reflection->getTable('users');
Información sobre la tabla
La tabla está representada por el objeto Table, que proporciona las siguientes propiedades de solo lectura:
$name: string– nombre de la tabla$view: bool– si es una vista$fullName: ?string– nombre completo de la tabla incluyendo el esquema (si existe)$columns: array<string, Column>– array asociativo de columnas de la tabla$indexes: Index[]– array de índices de la tabla$primaryKey: ?Index– clave primaria de la tabla onull$foreignKeys: ForeignKey[]– array de claves foráneas de la tabla
Columnas
La propiedad columns de la tabla proporciona un array asociativo de columnas, donde la clave es el nombre de la
columna y el valor es una instancia de Column con estas propiedades:
$name: string– nombre de la columna$table: ?Table– referencia a la tabla de la columna$nativeType: string– tipo de dato nativo de la base de datos$size: ?int– tamaño/longitud del tipo$nullable: bool– si la columna puede contener NULL$default: mixed– valor por defecto de la columna$autoIncrement: bool– si la columna es auto-increment$primary: bool– si es parte de la clave primaria$vendor: array– metadatos adicionales específicos del sistema de base de datos
foreach ($table->columns as $name => $column) {
echo "Columna: $name\n";
echo "Tipo: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Sí' : 'No') . "\n";
}
Índices
La propiedad indexes de la tabla proporciona un array de índices, donde cada índice es una instancia de Index con estas propiedades:
$columns: Column[]– array de columnas que forman el índice$unique: bool– si el índice es único$primary: bool– si es la clave primaria$name: ?string– nombre del índice
La clave primaria de la tabla se puede obtener usando la propiedad primaryKey, que devuelve un objeto
Index o null si la tabla no tiene clave primaria.
// Listado 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 " Columnas: $columns\n";
echo " Único: " . ($index->unique ? 'Sí' : 'No') . "\n";
}
// Listado de la clave primaria
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Clave primaria: $columns\n";
}
Claves foráneas
La propiedad foreignKeys de la tabla proporciona un array de claves foráneas, donde cada clave foránea es una
instancia de ForeignKey con estas
propiedades:
$foreignTable: Table– tabla referenciada$localColumns: Column[]– array de columnas locales$foreignColumns: Column[]– array de columnas referenciadas$name: ?string– nombre de la clave foránea
// Listado de claves foráneas
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";
}