Reflejo de la estructura
Nette Database proporciona herramientas para inspeccionar las estructuras de las bases de datos a través de la clase Nette\Database\Reflection. Esto le permite recuperar información sobre tablas, columnas, índices y claves externas. Puede utilizar reflection para generar esquemas, crear aplicaciones de bases de datos flexibles o crear 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 = $database->getReflection();
Recuperación de tablas
La propiedad de sólo lectura $reflection->tables
proporciona un array asociativo de todas las tablas de la
base de datos:
// Listado de los nombres de todas las tablas
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Hay dos métodos adicionales disponibles:
// Comprobar si existe una tabla
if ($reflection->hasTable('users')) {
echo "The table 'users' exists.";
}
// Recupera un objeto de tabla; lanza una excepción si no existe
$table = $reflection->getTable('users');
Información sobre la mesa
Una tabla se representa mediante el objeto Table, que proporciona las siguientes propiedades de sólo lectura:
$name: string
– el nombre de la tabla$view: bool
– si es una vista$fullName: ?string
– el nombre completo de la tabla, incluido el esquema (si procede)$columns: array<string, Column>
– una matriz asociativa de las columnas de la tabla$indexes: Index[]
– una matriz de los índices de la tabla$primaryKey: ?Index
– la clave primaria de la tabla onull
$foreignKeys: ForeignKey[]
– una matriz de las claves externas de la tabla
Columnas
La propiedad columns
de una 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 las siguientes propiedades:
$name: string
– el nombre de la columna$table: ?Table
– una referencia a la tabla de la columna$nativeType: string
– el tipo nativo de base de datos$size: ?int
– el tamaño/longitud del tipo$nullable: bool
– si la columna puede contenerNULL
$default: mixed
– el valor por defecto de la columna$autoIncrement: bool
– si la columna se autoincrementa$primary: bool
– si la columna forma parte de la clave primaria$vendor: array
– metadatos adicionales específicos del sistema de base de datos
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 una tabla contiene un array de índices, donde cada índice es una instancia de Index con las siguientes propiedades:
$columns: Column[]
– una matriz de columnas que componen el índice$unique: bool
– si el índice es único$primary: bool
– si es una clave primaria$name: ?string
– el nombre del índice
Se puede acceder a la clave primaria de una tabla a través de la propiedad primaryKey
, que devuelve un objeto
Index
o null
si la tabla no lo tiene.
// Listado de í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";
}
// Visualización de la clave primaria
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Primary Key: $columns\n";
}
Claves extranjeras
La propiedad foreignKeys
de una tabla contiene un array de claves foráneas, cada una representada como una
instancia de ForeignKey con las
siguientes propiedades:
$foreignTable: Table
– la tabla referenciada$localColumns: Column[]
– una matriz de columnas locales$foreignColumns: Column[]
– una matriz de columnas referenciadas$name: ?string
– el nombre de la clave externa
// Listado de claves externas
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";
}