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 oder null
  • $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 kann NULL
  • $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";
}
Version: 4.0