Reflexion der Struktur
Nette Database bietet Werkzeuge zur Untersuchung von Datenbankstrukturen durch die Klasse Nette\Database\Reflection. Damit können Sie Informationen über Tabellen, Spalten, Indizes und Fremdschlüssel abrufen. Sie können Reflection verwenden, um Schemata zu generieren, flexible Datenbankanwendungen zu erstellen oder allgemeine Datenbankwerkzeuge zu entwickeln.
Sie können das Reflection-Objekt von einer Datenbankverbindungsinstanz abrufen:
$reflection = $database->getReflection();
Abrufen von Tabellen
Die schreibgeschützte Eigenschaft $reflection->tables
liefert ein assoziatives Array aller Tabellen in der
Datenbank:
// Auflistung der Namen aller Tabellen
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Es sind zwei zusätzliche Methoden verfügbar:
// Prüfen, ob eine Tabelle existiert
if ($reflection->hasTable('users')) {
echo "The table 'users' exists.";
}
// Abrufen eines Tabellenobjekts; löst eine Ausnahme aus, wenn es nicht existiert
$table = $reflection->getTable('users');
Informationen zur Tabelle
Eine Tabelle wird durch das Table-Objekt dargestellt, das die folgenden schreibgeschützten Eigenschaften aufweist:
$name: string
– der Name der Tabelle$view: bool
– ob es sich um einen View handelt$fullName: ?string
– der vollständige Name der Tabelle, einschließlich Schema (falls zutreffend)$columns: array<string, Column>
– ein assoziatives Array mit den Spalten der Tabelle$indexes: Index[]
– ein Array mit den Indizes der Tabelle$primaryKey: ?Index
– der Primärschlüssel der Tabelle odernull
$foreignKeys: ForeignKey[]
– ein Array mit den Fremdschlüsseln der Tabelle
Spalten
Die Eigenschaft columns
einer Tabelle bietet ein assoziatives Array von Spalten, wobei der Schlüssel der
Spaltenname und der Wert eine Instanz von Column mit den folgenden
Eigenschaften ist:
$name: string
– der Name der Spalte$table: ?Table
– ein Verweis auf die Tabelle der Spalte$nativeType: string
– der native Datenbanktyp$size: ?int
– die Größe/Länge des Typs$nullable: bool
– ob die Spalte enthalten kannNULL
$default: mixed
– der Standardwert der Spalte$autoIncrement: bool
– ob die Spalte automatisch inkrementiert wird$primary: bool
– ob die Spalte Teil des Primärschlüssels ist$vendor: array
– zusätzliche, für das Datenbanksystem spezifische Metadaten
foreach ($table->columns as $name => $column) {
echo "Column: $name\n";
echo "Type: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Yes' : 'No') . "\n";
}
Indizes
Die Eigenschaft indexes
einer Tabelle enthält ein Array von Indizes, wobei jeder Index eine Instanz von Index mit den folgenden
Eigenschaften ist:
$columns: Column[]
– ein Array von Spalten, aus denen der Index besteht$unique: bool
– ob der Index eindeutig ist$primary: bool
– ob er ein Primärschlüssel ist$name: ?string
– der Name des Indexes
Auf den Primärschlüssel einer Tabelle kann über die Eigenschaft primaryKey
zugegriffen werden, die ein
Index
Objekt oder null
zurückgibt, wenn die Tabelle keinen Primärschlüssel hat.
// Indizes auflisten
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";
}
// Anzeige des Primärschlüssels
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Primary Key: $columns\n";
}
Ausländische Schlüssel
Die Eigenschaft foreignKeys
einer Tabelle enthält ein Array von Fremdschlüsseln, die jeweils als eine Instanz
von ForeignKey mit den folgenden
Eigenschaften dargestellt werden:
$foreignTable: Table
– die referenzierte Tabelle$localColumns: Column[]
– ein Array von lokalen Spalten$foreignColumns: Column[]
– ein Array von referenzierten Spalten$name: ?string
– der Name des Fremdschlüssels
// Auflisten von Fremdschlüsseln
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";
}