Reflet de la structure

Nette Database fournit des outils pour inspecter les structures des bases de données par le biais de la classe Nette\Database\Reflection. Celle-ci vous permet de récupérer des informations sur les tables, les colonnes, les index et les clés étrangères. Vous pouvez utiliser la réflexion pour générer des schémas, créer des applications de base de données flexibles ou construire des outils de base de données généraux.

Vous pouvez obtenir l'objet de réflexion à partir d'une instance de connexion à la base de données :

$reflection = $database->getReflection();

Récupération de tableaux

La propriété en lecture seule $reflection->tables fournit un tableau associatif de toutes les tables de la base de données :

// Liste des noms de tous les tableaux
foreach ($reflection->tables as $name => $table) {
	echo $name . "\n";
}

Deux méthodes supplémentaires sont disponibles :

// Vérifier si une table existe
if ($reflection->hasTable('users')) {
	echo "The table 'users' exists.";
}

// Récupère un objet table; lève une exception s'il n'existe pas.
$table = $reflection->getTable('users');

Informations sur les tables

Un tableau est représenté par l'objet Table, qui fournit les propriétés suivantes en lecture seule :

  • $name: string – le nom du tableau
  • $view: bool – s'il s'agit d'une vue
  • $fullName: ?string – le nom complet de la table, y compris le schéma (le cas échéant)
  • $columns: array<string, Column> – un tableau associatif des colonnes de la table
  • $indexes: Index[] – un tableau des index de la table
  • $primaryKey: ?Index – la clé primaire de la table ou null
  • $foreignKeys: ForeignKey[] – un tableau des clés étrangères de la table

Colonnes

La propriété columns d'une table fournit un tableau associatif de colonnes, où la clé est le nom de la colonne et la valeur est une instance de Column avec les propriétés suivantes :

  • $name: string – le nom de la colonne
  • $table: ?Table – une référence à la table de la colonne
  • $nativeType: string – le type de base de données natif
  • $size: ?int – la taille/longueur du type
  • $nullable: bool – si la colonne peut contenir NULL
  • $default: mixed – la valeur par défaut de la colonne
  • $autoIncrement: bool – si la colonne est auto-incrémentée
  • $primary: bool – si la colonne fait partie de la clé primaire
  • $vendor: array – métadonnées supplémentaires spécifiques au système de base de données
foreach ($table->columns as $name => $column) {
	echo "Column: $name\n";
	echo "Type: {$column->nativeType}\n";
	echo "Nullable: " . ($column->nullable ? 'Yes' : 'No') . "\n";
}

Index

La propriété indexes d'une table contient un tableau d'index, où chaque index est une instance d'Index avec les propriétés suivantes :

  • $columns: Column[] – un tableau de colonnes qui composent l'index
  • $unique: bool – si l'index est unique
  • $primary: bool – s'il s'agit d'une clé primaire
  • $name: ?string – le nom de l'index

La clé primaire d'une table est accessible via la propriété primaryKey, qui renvoie un objet Index ou null si la table n'en a pas.

// Liste des index
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";
}

// Affichage de la clé primaire
if ($primaryKey = $table->primaryKey) {
	$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
	echo "Primary Key: $columns\n";
}

Clés étrangères

La propriété foreignKeys d'une table contient un tableau de clés étrangères, chacune représentée par une instance de ForeignKey avec les propriétés suivantes :

  • $foreignTable: Table – la table référencée
  • $localColumns: Column[] – un tableau de colonnes locales
  • $foreignColumns: Column[] – un tableau de colonnes référencées
  • $name: ?string – le nom de la clé étrangère
// Lister les clés étrangères
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";
}
version: 4.0