close

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