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";
}
Version: 4.0