Strukturreflexion
Nette Database stellt mit der Klasse Nette\Database\Reflection Werkzeuge zur Introspektion der Datenbankstruktur bereit. Damit lassen sich Informationen über Tabellen, Spalten, Indizes und Fremdschlüssel abrufen. Sie können die Reflexion nutzen, um Schemata zu generieren, flexible Anwendungen zu bauen, die mit der Datenbank arbeiten, oder allgemeine Datenbankwerkzeuge zu schreiben.
Das Reflexionsobjekt erhalten Sie von der Instanz der Datenbankverbindung:
$reflection = $database->getReflection();
Abrufen von Tabellen
Die Readonly-Property $reflection->tables enthält ein assoziatives Array aller Tabellen der Datenbank:
// Ausgabe der Namen aller Tabellen
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Zwei weitere Methoden stehen zur Verfügung:
// Prüfung, ob eine Tabelle existiert
if ($reflection->hasTable('users')) {
echo "Die Tabelle users existiert";
}
// Gibt das Tabellenobjekt zurück; wirft eine Exception, wenn es nicht existiert
$table = $reflection->getTable('users');
Informationen über eine Tabelle
Eine Tabelle wird durch das Objekt Table repräsentiert, das die folgenden Readonly-Properties bietet:
$name: string– Name der Tabelle$view: bool– ob es sich um einen View 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$comment: ?string– Kommentar zur Tabelle
Spalten
Die Property columns der Tabelle liefert ein assoziatives Array der Spalten, in dem der Schlüssel der Spaltenname
und der Wert eine Instanz von Column mit
diesen Properties 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 darf$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, spezifisch für das jeweilige Datenbanksystem$comment: ?string– Kommentar zur Spalte
foreach ($table->columns as $name => $column) {
echo "Spalte: $name\n";
echo "Typ: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Ja' : 'Nein') . "\n";
}
Indizes
Die Property indexes der Tabelle liefert ein Array von Indizes, wobei jeder Index eine Instanz von Index mit diesen Properties ist:
$columns: Column[]– Array der Spalten, die den Index bilden$unique: bool– ob der Index eindeutig ist$primary: bool– ob es sich um einen Primärschlüssel handelt$name: ?string– Name des Index
Den Primärschlüssel der Tabelle erhalten Sie über die Property primaryKey, die entweder ein
Index-Objekt oder null zurückgibt, wenn 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 " Eindeutig: " . ($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 Property foreignKeys der Tabelle liefert ein Array von Fremdschlüsseln, wobei jeder Fremdschlüssel eine
Instanz von ForeignKey mit diesen
Properties ist:
$foreignTable: Table– die 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";
}