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