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"; }