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 KonstantenNette\Utils\Type
).nullable
:true
wenn die SpalteNULL
enthalten kann, sonstfalse
.primary
:true
, wenn die Spalte Teil des Primärschlüssels ist, sonstfalse
.autoIncrement
:true
wenn die Spalte auto-increment ist, sonstfalse
.default
: Der Standardwert der Spalte, odernull
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 vonNette\Database\Reflection\Column
Objekten, die die Spalten darstellen, die Teil des Indexes sind.unique
:true
wenn der Index eindeutig ist, ansonstenfalse
.primary
:true
wenn der Index der Primärschlüssel ist, andernfallsfalse
.
$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 vonNette\Database\Reflection\Column
Objekten, die die lokalen Spalten darstellen, aus denen der Fremdschlüssel besteht.foreignTable
: EinNette\Database\Reflection\Table
Objekt, das die Fremdtabelle darstellt, auf die der Fremdschlüssel verweist.foreignColumns
: Ein Array vonNette\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";
}