Réflexion de la structure
Nette Database fournit des outils d'introspection de la structure de la base de données à l'aide de la classe Nette\Database\Reflection. Elle permet d'obtenir 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 souples travaillant avec la base de données, ou des outils de base de données généraux.
L'objet de réflexion s'obtient depuis l'instance de connexion à la base de données :
$reflection = $database->getReflection();
Récupérer les tables
La propriété en lecture seule $reflection->tables contient un tableau associatif de toutes les tables de la
base de données :
// Liste les noms de toutes les tables
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Deux méthodes supplémentaires sont disponibles :
// Vérifie l'existence d'une table
if ($reflection->hasTable('users')) {
echo "La table users existe";
}
// Renvoie l'objet de la table ; lève une exception si elle n'existe pas
$table = $reflection->getTable('users');
Informations sur la table
Une table est représentée par l'objet Table, qui fournit les propriétés en lecture seule suivantes :
$name: string– nom de la table$view: bool– s'il s'agit d'une vue$fullName: ?string– nom complet de la table, schéma compris (s'il existe)$columns: array<string, Column>– tableau associatif des colonnes de la table$indexes: Index[]– tableau des index de la table$primaryKey: ?Index– clé primaire de la table, ou null$foreignKeys: ForeignKey[]– tableau des clés étrangères de la table$comment: ?string– commentaire de la table
Colonnes
La propriété columns de la table fournit un tableau associatif de colonnes, où la clé est le nom de la colonne
et la valeur une instance de Column avec
ces propriétés :
$name: string– nom de la colonne$table: ?Table– référence à la table de la colonne$nativeType: string– type natif de la base de données$size: ?int– taille/longueur du type$nullable: bool– si la colonne peut contenir NULL$default: mixed– valeur par défaut de la colonne$autoIncrement: bool– si la colonne est auto-incrémentée$primary: bool– si elle fait partie de la clé primaire$vendor: array– métadonnées supplémentaires propres au système de base de données concerné$comment: ?string– commentaire de la colonne
foreach ($table->columns as $name => $column) {
echo "Colonne : $name\n";
echo "Type : {$column->nativeType}\n";
echo "Nullable : " . ($column->nullable ? 'Oui' : 'Non') . "\n";
}
Index
La propriété indexes de la table fournit un tableau d'index, où chaque index est une instance de Index avec ces propriétés :
$columns: Column[]– tableau des colonnes composant l'index$unique: bool– si l'index est unique$primary: bool– s'il s'agit d'une clé primaire$name: ?string– nom de l'index
La clé primaire de la table s'obtient à l'aide de la propriété primaryKey, qui renvoie soit un objet
Index, soit null si la table n'a pas de clé primaire.
// Liste les index
foreach ($table->indexes as $index) {
$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
echo "Index" . ($index->name ? " {$index->name}" : '') . ":\n";
echo " Colonnes : $columns\n";
echo " Unique : " . ($index->unique ? 'Oui' : 'Non') . "\n";
}
// Liste la clé primaire
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Clé primaire : $columns\n";
}
Clés étrangères
La propriété foreignKeys de la table fournit un tableau de clés étrangères, où chaque clé étrangère est
une instance de ForeignKey avec ces
propriétés :
$foreignTable: Table– la table référencée$localColumns: Column[]– tableau des colonnes locales$foreignColumns: Column[]– tableau des colonnes référencées$name: string– nom de la clé étrangère
// Liste 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";
}