Reflexión de la estructura
Nette Database ofrece herramientas para introspeccionar la estructura de la base de datos mediante la clase Nette\Database\Reflection. Permite obtener información sobre las tablas, las columnas, los índices y las claves foráneas. Puede usar la reflexión para generar esquemas, crear aplicaciones flexibles que trabajen con la base de datos o herramientas generales de bases de datos.
El objeto de reflexión se obtiene de la instancia de la conexión a la base de datos:
$reflection = $database->getReflection();
Obtener las tablas
La propiedad de solo lectura $reflection->tables contiene un array asociativo de todas las tablas de la base
de datos:
// Lista los nombres de todas las tablas
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Hay disponibles otros dos métodos:
// Comprueba la existencia de una tabla
if ($reflection->hasTable('users')) {
echo "Table users exists";
}
// Devuelve el objeto de la tabla; lanza una excepción si no existe
$table = $reflection->getTable('users');
Información de la tabla
Una tabla está representada por el objeto Table, que ofrece 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, incluido el esquema (si existe)$columns: array<string, Column>: array asociativo de las columnas de la tabla$indexes: Index[]: array de los índices de la tabla$primaryKey: ?Index: clave primaria de la tabla, o null$foreignKeys: ForeignKey[]: array de las claves foráneas de la tabla$comment: ?string: comentario de la tabla
Columnas
La propiedad columns de la tabla ofrece un array asociativo de columnas en el que 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 nativo de la base de datos$size: ?int: tamaño 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 autoincremental$primary: bool: si forma parte de la clave primaria$vendor: array: metadatos adicionales específicos del sistema de base de datos$comment: ?string: comentario de la columna
foreach ($table->columns as $name => $column) {
echo "Column: $name\n";
echo "Type: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Yes' : 'No') . "\n";
}
Índices
La propiedad indexes de la tabla ofrece un array de índices en el que cada índice es una instancia de Index con estas propiedades:
$columns: Column[]: array de las columnas que forman el índice$unique: bool: si el índice es único$primary: bool: si es una clave primaria$name: ?string: nombre del índice
La clave primaria de la tabla se puede obtener con la propiedad primaryKey, que devuelve un objeto
Index o null si la tabla no tiene clave primaria.
// Lista los índices
foreach ($table->indexes as $index) {
$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
echo "Index" . ($index->name ? " {$index->name}" : '') . ":\n";
echo " Columns: $columns\n";
echo " Unique: " . ($index->unique ? 'Yes' : 'No') . "\n";
}
// Lista la clave primaria
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Primary Key: $columns\n";
}
Claves foráneas
La propiedad foreignKeys de la tabla ofrece un array de claves foráneas en el que cada clave foránea es una
instancia de ForeignKey con estas
propiedades:
$foreignTable: Table: la tabla referenciada$localColumns: Column[]: array de las columnas locales$foreignColumns: Column[]: array de las columnas referenciadas$name: string: nombre de la clave foránea
// Lista las 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";
}