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 constantesNette\Utils\Type
).nullable
:true
si la colonne peut contenirNULL
, sinonfalse
.primary
:true
si la colonne fait partie de la clé primaire, sinonfalse
.autoIncrement
:true
si la colonne est auto-incrémentée, sinonfalse
.default
: La valeur par défaut de la colonne, ounull
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'objetsNette\Database\Reflection\Column
représentant les colonnes qui font partie de l'index.unique
:true
si l'index est unique, sinonfalse
.primary
:true
si l'index est la clé primaire, sinonfalse
.
$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'objetsNette\Database\Reflection\Column
représentant les colonnes locales qui composent la clé étrangère.foreignTable
: Un objetNette\Database\Reflection\Table
représentant la table étrangère à laquelle la clé étrangère fait référence.foreignColumns
: Un tableau d'objetsNette\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";
}