Reflexe

Nette Database fournit des outils pour l'introspection de la structure de la base de données en utilisant la classe Nette\Database\Reflection\Reflection. Celle-ci vous permet de récupérer des informations sur les tables, les colonnes, les index et les clés étrangères. La réflexion peut être utilisée pour la génération de schémas, la création d'applications flexibles basées sur des bases de données ou des outils généraux pour les bases de données.

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

$reflection = $connection->getReflection();

Travailler avec des tableaux

En utilisant la réflexion, nous pouvons parcourir toutes les tables de la base de données :

getTables(): Nette\Database\Reflection\Table[]

Renvoie un tableau associatif dont la clé est le nom de la table et la valeur est un tableau de métadonnées de la table.

// Liste de tous les noms de tables
foreach ($reflection->getTables() as $table) {
	echo $table['name'] . "\n";
}

hasTable (string $name): bool

Renvoie true si la table existe, sinon false.

// Vérification de l'existence d'une table
if ($reflection->hasTable('users')) {
	echo "The 'users' table exists";
}

getTable (string $name): Nette\Database\Reflection\Table

Renvoie l'objet Nette\Database\Reflection\Table représentant la table donnée. Si la table n'existe pas, une exception est levée Nette\Database\Exception\MissingTableException.

// Récupération d'un tableau spécifique
$table = $reflection->getTable('users');

Informations sur les colonnes

L'objet Nette\Database\Reflection\Table, obtenu en appelant getTable(), permet d'obtenir des informations détaillées sur les colonnes d'un tableau.

getColumns(): Nette\Database\Reflection\Column[]

Renvoie un tableau d'objets Nette\Database\Reflection\Column représentant les colonnes du tableau.

getColumn (string $name): Nette\Database\Reflection\Column

Renvoie l'objet Nette\Database\Reflection\Column représentant la colonne donnée. Si la colonne n'existe pas, une exception est levée Nette\Database\Exception\MissingColumnException.

L'objet Column fournit les propriétés suivantes :

  • name: Le nom de la colonne.
  • nativeType: Le type de données de la colonne spécifique à la base de données.
  • type: Le type de données normalisé de la colonne (voir les constantes Nette\Utils\Type).
  • nullable: true si la colonne peut contenir NULL, sinon false.
  • primary: true si la colonne fait partie de la clé primaire, sinon false.
  • autoIncrement: true si la colonne est auto-incrémentée, sinon false.
  • default: La valeur par défaut de la colonne, ou null si elle n'est pas définie.
  • vendor: Un tableau contenant des informations supplémentaires spécifiques à la base de données.
// Interroger toutes les colonnes du tableau "utilisateurs".
$table = $reflection->getTable('users');
foreach ($table->getColumns() as $column) {
	echo "Column: " . $column->name . "\n";
	echo "Type: " . $column->nativeType . "\n";
	echo "Allows NULL: " . ($column->nullable ? 'Yes': 'No') . "\n";
	echo "Default value: " . ($column->default ?? 'None') . "\n";
	echo "Is primary key: " . ($column->primary ? 'Yes': 'No') . "\n";
	echo "Is auto-increment: " . ($column->autoIncrement ? 'Yes': 'No') . "\n";
}

// Récupération d'une colonne spécifique
$idColumn = $table->getColumn('id');

Index et clés primaires

getIndexes(): Nette\Database\Reflection\Index[]

Renvoie un tableau d'objets Nette\Database\Reflection\Index représentant les index des tables.

getIndex (string $name): Nette\Database\Reflection\Index

Renvoie l'objet Nette\Database\Reflection\Index représentant l'index donné. Si l'index n'existe pas, une exception est levée Nette\Database\Exception\MissingIndexException.

getPrimaryKey(): ?Nette\Database\Reflection\Index

Renvoie l'objet Nette\Database\Reflection\Index représentant la clé primaire de la table, ou null si la table n'a pas de clé primaire.

L'objet Index fournit les propriétés suivantes :

  • name: Le nom de l'index.
  • columns: Un tableau d'objets Nette\Database\Reflection\Column représentant les colonnes qui font partie de l'index.
  • unique: true si l'index est unique, sinon false.
  • primary: true si l'index est la clé primaire, sinon false.
$table = $reflection->getTable('users');

$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));

// Liste de tous les index
foreach ($table->getIndexes() as $index) {
	echo "Index: " . ($index->name ?? 'Unnamed') . "\n";
	echo "Columns: " . $printColumnNames($index->columns) . "\n";
	echo "Is unique: " . ($index->unique ? 'Yes': 'No') . "\n";
	echo "Is primary key: " . ($index->primary ? 'Yes': 'No') . "\n";
}

// Récupération de la clé primaire
if ($primaryKey = $table->getPrimaryKey()) {
	echo "Primary key: " . $printColumnNames($primaryKey->columns) . "\n";
}

Clés étrangères

getForeignKeys(): Nette\Database\Reflection\ForeignKey[]

Renvoie un tableau d'objets Nette\Database\Reflection\ForeignKey représentant les clés étrangères de la table.

getForeignKey (string $name): Nette\Database\Reflection\ForeignKey

Renvoie l'objet Nette\Database\Reflection\ForeignKey représentant la clé étrangère donnée. Si la clé étrangère n'existe pas, une exception est levée Nette\Database\Exception\MissingForeignKeyException.

L'objet ForeignKey possède les propriétés suivantes :

  • name: Le nom de la clé étrangère.
  • localColumns: Un tableau d'objets Nette\Database\Reflection\Column représentant les colonnes locales qui composent la clé étrangère.
  • foreignTable: Un objet Nette\Database\Reflection\Table représentant la table étrangère à laquelle la clé étrangère fait référence.
  • foreignColumns: Un tableau d'objets Nette\Database\Reflection\Column représentant les colonnes étrangères auxquelles la clé étrangère fait référence.
$table = $reflection->getTable('books');

$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));

foreach ($table->getForeignKeys() as $fk) {
	echo "Foreign key: " . ($fk->name ?? 'Unnamed') . "\n";
	echo "Local columns: " . $printColumnNames($fk->localColumns) . "\n";
	echo "References table: {$fk->foreignTable->name}\n";
	echo "References columns: " . $printColumnNames($fk->foreignColumns) . "\n";
}
version: 4.0