Reflexe

Nette Database bietet Werkzeuge für die Introspektion der Datenbankstruktur unter Verwendung der Klasse Nette\Database\Reflection\Reflection. Damit können Sie Informationen über Tabellen, Spalten, Indizes und Fremdschlüssel abrufen. Reflection kann für die Schemaerstellung, die Erstellung flexibler datenbankgestützter Anwendungen oder allgemeine Datenbank-Tools verwendet werden.

Sie können das Reflection-Objekt von einer Datenbankverbindungsinstanz erhalten:

$reflection = $connection->getReflection();

Arbeiten mit Tabellen

Mit Reflection können wir alle Tabellen in der Datenbank durchsuchen:

getTables(): Nette\Database\Reflection\Table[]

Gibt ein assoziatives Array zurück, wobei der Schlüssel der Tabellenname und der Wert ein Array mit Tabellenmetadaten ist.

// Auflistung aller Tabellennamen
foreach ($reflection->getTables() as $table) {
	echo $table['name'] . "\n";
}

hasTable (string $name): bool

Gibt true zurück, wenn die Tabelle existiert, andernfalls false.

// Überprüfung der Existenz von Tabellen
if ($reflection->hasTable('users')) {
	echo "The 'users' table exists";
}

getTable (string $name): Nette\Database\Reflection\Table

Gibt das Nette\Database\Reflection\Table Objekt zurück, das die angegebene Tabelle repräsentiert. Existiert die Tabelle nicht, wird eine Ausnahme geworfen Nette\Database\Exception\MissingTableException.

// Abrufen einer bestimmten Tabelle
$table = $reflection->getTable('users');

Informationen über Säulen

Mit dem Objekt Nette\Database\Reflection\Table, das Sie durch den Aufruf von getTable() erhalten, können Sie detaillierte Informationen über Tabellenspalten abrufen.

getColumns(): Nette\Database\Reflection\Column[]

Gibt ein Array von Nette\Database\Reflection\Column Objekten zurück, die die Tabellenspalten darstellen.

getColumn (string $name): Nette\Database\Reflection\Column

Gibt das Nette\Database\Reflection\Column Objekt zurück, das die angegebene Spalte darstellt. Existiert die Spalte nicht, wird eine Exception Nette\Database\Exception\MissingColumnException ausgelöst.

Das Objekt Column bietet die folgenden Eigenschaften:

  • name: Der Spaltenname.
  • nativeType: Der datenbankspezifische Datentyp der Spalte.
  • type: Der normalisierte Datentyp der Spalte (siehe Konstanten Nette\Utils\Type).
  • nullable: true wenn die Spalte NULL enthalten kann, sonst false.
  • primary: true, wenn die Spalte Teil des Primärschlüssels ist, sonst false.
  • autoIncrement: true wenn die Spalte auto-increment ist, sonst false.
  • default: Der Standardwert der Spalte, oder null wenn nicht definiert.
  • vendor: Ein Array mit zusätzlichen datenbankspezifischen Informationen.
// Iterieren durch alle Spalten in der Tabelle "users".
$table = $reflection->getTable('users');
foreach ($table->getColumns() as $column) {
	echo "Column: " . $column->name . "\n";
	echo "Type: " . $column->nativeType . "\n";
	echo "Allows NULL: " . ($column->nullable ? 'Yes': 'No') . "\n";
	echo "Default value: " . ($column->default ?? 'None') . "\n";
	echo "Is primary key: " . ($column->primary ? 'Yes': 'No') . "\n";
	echo "Is auto-increment: " . ($column->autoIncrement ? 'Yes': 'No') . "\n";
}

// Abrufen einer bestimmten Spalte
$idColumn = $table->getColumn('id');

Indizes und Primärschlüssel

getIndexes(): Nette\Database\Reflection\Index[]

Gibt ein Array von Nette\Database\Reflection\Index Objekten zurück, die die Tabellenindizes darstellen.

getIndex (string $name): Nette\Database\Reflection\Index

Gibt das Nette\Database\Reflection\Index Objekt zurück, das den angegebenen Index darstellt. Existiert der Index nicht, wird eine Exception Nette\Database\Exception\MissingIndexException ausgelöst.

getPrimaryKey(): ?Nette\Database\Reflection\Index

Gibt das Objekt Nette\Database\Reflection\Index zurück, das den Primärschlüssel der Tabelle darstellt, oder null, wenn die Tabelle keinen Primärschlüssel hat.

Das Objekt Index bietet die folgenden Eigenschaften:

  • name: Der Name des Indexes.
  • columns: Ein Array von Nette\Database\Reflection\Column Objekten, die die Spalten darstellen, die Teil des Indexes sind.
  • unique: true wenn der Index eindeutig ist, ansonsten false.
  • primary: true wenn der Index der Primärschlüssel ist, andernfalls false.
$table = $reflection->getTable('users');

$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));

// Auflistung aller Indizes
foreach ($table->getIndexes() as $index) {
	echo "Index: " . ($index->name ?? 'Unnamed') . "\n";
	echo "Columns: " . $printColumnNames($index->columns) . "\n";
	echo "Is unique: " . ($index->unique ? 'Yes': 'No') . "\n";
	echo "Is primary key: " . ($index->primary ? 'Yes': 'No') . "\n";
}

// Abrufen des Primärschlüssels
if ($primaryKey = $table->getPrimaryKey()) {
	echo "Primary key: " . $printColumnNames($primaryKey->columns) . "\n";
}

Fremdschlüssel

getForeignKeys(): Nette\Database\Reflection\ForeignKey[]

Gibt ein Array von Nette\Database\Reflection\ForeignKey Objekten zurück, die die Fremdschlüssel der Tabelle darstellen.

getForeignKey (string $name): Nette\Database\Reflection\ForeignKey

Gibt das Nette\Database\Reflection\ForeignKey Objekt zurück, das den angegebenen Fremdschlüssel darstellt. Existiert der Fremdschlüssel nicht, wird eine Ausnahme Nette\Database\Exception\MissingForeignKeyException ausgelöst.

Das Objekt ForeignKey bietet die folgenden Eigenschaften:

  • name: Der Name des Fremdschlüssels.
  • localColumns: Ein Array von Nette\Database\Reflection\Column Objekten, die die lokalen Spalten darstellen, aus denen der Fremdschlüssel besteht.
  • foreignTable: Ein Nette\Database\Reflection\Table Objekt, das die Fremdtabelle darstellt, auf die der Fremdschlüssel verweist.
  • foreignColumns: Ein Array von Nette\Database\Reflection\Column Objekten, die die Fremdspalten darstellen, auf die der Fremdschlüssel verweist.
$table = $reflection->getTable('books');

$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));

foreach ($table->getForeignKeys() as $fk) {
	echo "Foreign key: " . ($fk->name ?? 'Unnamed') . "\n";
	echo "Local columns: " . $printColumnNames($fk->localColumns) . "\n";
	echo "References table: {$fk->foreignTable->name}\n";
	echo "References columns: " . $printColumnNames($fk->foreignColumns) . "\n";
}
Version: 4.0