[Go to site: main page, start]

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";
}
Version: 4.x