Réflexion de la structure
Nette Database fournit des outils pour l'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 flexibles travaillant avec la base de données ou des outils de base de données généraux.
Nous obtenons l'objet de réflexion à partir de l'instance de connexion à la base de données :
$reflection = $database->getReflection();
Obtention des tables
La propriété en lecture seule $reflection->tables
contient un tableau associatif de toutes les tables de la
base de données :
// Liste des noms de toutes les tables
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Deux autres méthodes sont également disponibles :
// Vérification de l'existence de la table
if ($reflection->hasTable('users')) {
echo "La table users existe";
}
// Renvoie l'objet table ; lève une exception s'il n'existe pas
$table = $reflection->getTable('users');
Informations sur la table
La 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 incluant le schéma (si existant)$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
Colonnes
La propriété columns
de la table fournit un tableau associatif des colonnes, où la clé est le nom de la
colonne et la valeur est 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 de base de données natif$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 spécifiques au système de base de données donné
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 formant l'index$unique: bool
– si l'index est unique$primary: bool
– s'il s'agit de la clé primaire$name: ?string
– nom de l'index
La clé primaire de la table peut être obtenue à 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 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 " Colonnes : $columns\n";
echo " Unique : " . ($index->unique ? 'Oui' : 'Non') . "\n";
}
// Liste de 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
– 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 des 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";
}