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 o null
  • $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";
}
versión: 4.0