Strukturreflexion
Nette Database bietet Werkzeuge zur Introspektion der Datenbankstruktur mithilfe der Klasse Nette\Database\Reflection. Sie ermöglicht das Abrufen von Informationen über Tabellen, Spalten, Indizes und Fremdschlüssel. Die Reflexion können Sie zur Generierung von Schemata, zur Erstellung flexibler Anwendungen, die mit der Datenbank arbeiten, oder für allgemeine Datenbankwerkzeuge nutzen.
Das Reflexionsobjekt erhalten wir aus der Instanz der Datenbankverbindung:
$reflection = $database->getReflection();
Abrufen von Tabellen
Die readonly-Eigenschaft $reflection->tables
enthält ein assoziatives Array aller Tabellen in der
Datenbank:
// Ausgabe der Namen aller Tabellen
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Es stehen noch zwei weitere Methoden zur Verfügung:
// Überprüfung der Existenz einer Tabelle
if ($reflection->hasTable('users')) {
echo "Tabelle users existiert";
}
// Gibt das Tabellenobjekt zurück; wenn es nicht existiert, wird eine Ausnahme ausgelöst
$table = $reflection->getTable('users');
Informationen über eine Tabelle
Eine Tabelle wird durch das Objekt Table repräsentiert, das die folgenden readonly-Eigenschaften bereitstellt:
$name: string
– Name der Tabelle$view: bool
– ob es sich um eine Ansicht handelt$fullName: ?string
– vollständiger Name der Tabelle einschließlich Schema (falls vorhanden)$columns: array<string, Column>
– assoziatives Array der Tabellenspalten$indexes: Index[]
– Array der Tabellenindizes$primaryKey: ?Index
– Primärschlüssel der Tabelle oder null$foreignKeys: ForeignKey[]
– Array der Fremdschlüssel der Tabelle
Spalten
Die Eigenschaft columns
der Tabelle liefert ein assoziatives Array von Spalten, wobei der Schlüssel der
Spaltenname und der Wert eine Instanz von Column mit diesen Eigenschaften ist:
$name: string
– Name der Spalte$table: ?Table
– Referenz auf die Tabelle der Spalte$nativeType: string
– nativer Datenbanktyp$size: ?int
– Größe/Länge des Typs$nullable: bool
– ob die Spalte NULL enthalten kann$default: mixed
– Standardwert der Spalte$autoIncrement: bool
– ob die Spalte auto-increment ist$primary: bool
– ob sie Teil des Primärschlüssels ist$vendor: array
– zusätzliche Metadaten, die spezifisch für das jeweilige Datenbanksystem sind
foreach ($table->columns as $name => $column) {
echo "Spalte: $name\n";
echo "Typ: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Ja' : 'Nein') . "\n";
}
Indizes
Die Eigenschaft indexes
der Tabelle liefert ein Array von Indizes, wobei jeder Index eine Instanz von Index mit diesen Eigenschaften ist:
$columns: Column[]
– Array der Spalten, die den Index bilden$unique: bool
– ob der Index eindeutig ist$primary: bool
– ob es sich um den Primärschlüssel handelt$name: ?string
– Name des Index
Der Primärschlüssel der Tabelle kann über die Eigenschaft primaryKey
abgerufen werden, die entweder ein
Index
-Objekt oder null
zurückgibt, falls die Tabelle keinen Primärschlüssel hat.
// Ausgabe der Indizes
foreach ($table->indexes as $index) {
$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
echo "Index" . ($index->name ? " {$index->name}" : '') . ":\n";
echo " Spalten: $columns\n";
echo " Unique: " . ($index->unique ? 'Ja' : 'Nein') . "\n";
}
// Ausgabe des Primärschlüssels
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Primärschlüssel: $columns\n";
}
Fremdschlüssel
Die Eigenschaft foreignKeys
der Tabelle liefert ein Array von Fremdschlüsseln, wobei jeder Fremdschlüssel eine
Instanz von ForeignKey mit diesen
Eigenschaften ist:
$foreignTable: Table
– referenzierte Tabelle$localColumns: Column[]
– Array der lokalen Spalten$foreignColumns: Column[]
– Array der referenzierten Spalten$name: ?string
– Name des Fremdschlüssels
// Ausgabe der Fremdschlüssel
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";
}