Отражение на структурата
Nette Database предоставя инструменти за инспектиране на структурите на базата данни чрез класа Nette\Database\Reflection. Това ви позволява да извличате информация за таблици, колони, индекси и външни ключове. Можете да използвате отражението, за да генерирате схеми, да създавате гъвкави приложения за бази данни или да изграждате общи инструменти за бази данни.
Можете да получите обекта за отразяване от инстанция за връзка с база данни:
$reflection = $database->getReflection();
Извличане на таблици
Свойството само за четене $reflection->tables
предоставя асоциативен
масив от всички таблици в базата данни:
// Изписване на имената на всички таблици
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Налични са два допълнителни метода:
// Проверка дали съществува таблица
if ($reflection->hasTable('users')) {
echo "The table 'users' exists.";
}
// Извличане на обект на таблица; ако не съществува, се хвърля изключение
$table = $reflection->getTable('users');
Информация за таблицата
Таблицата се представя от обекта Table, който предоставя следните свойства само за четене:
$name: string
– име на таблицата$view: bool
– дали тя е изглед$fullName: ?string
– пълното име на таблицата, включително схемата (ако е приложимо)$columns: array<string, Column>
– асоциативен масив от колони на таблицата$indexes: Index[]
– масив от индекси на таблицата$primaryKey: ?Index
– първичен ключ на таблицата илиnull
$foreignKeys: ForeignKey[]
– масив от външни ключове на таблицата
Колони
Свойството columns
на дадена таблица предоставя асоциативен
масив от колони, където ключът е името на колоната, а стойността е
екземпляр на Column със
следните свойства:
$name: string
– име на колоната$table: ?Table
– препратка към таблицата на колоната$nativeType: string
– родният тип на базата данни$size: ?int
– размер/дължина на типа$nullable: bool
– дали колоната може да съдържаNULL
$default: mixed
– стойност по подразбиране на колоната$autoIncrement: bool
– дали колоната се увеличава автоматично$primary: bool
– дали колоната е част от първичния ключ$vendor: array
– допълнителни метаданни, специфични за системата на базата данни
foreach ($table->columns as $name => $column) {
echo "Column: $name\n";
echo "Type: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Yes' : 'No') . "\n";
}
Индекси
Свойството indexes
на дадена таблица съдържа масив от индекси,
като всеки индекс е инстанция на Index със следните
свойства:
$columns: Column[]
– масив от колони, които съставляват индекса$unique: bool
– дали индексът е уникален$primary: bool
– дали е първичен ключ$name: ?string
– име на индекса
Достъпът до първичния ключ на дадена таблица може да се осъществи
чрез свойството primaryKey
, което връща обект Index
или
null
, ако таблицата няма такъв.
// Индекси за вписване
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";
}
// Извеждане на първичния ключ
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Primary Key: $columns\n";
}
Чужди ключове
Свойството foreignKeys
на дадена таблица съдържа масив от чужди
ключове, всеки от които е представен като инстанция на ForeignKey със следните
свойства:
$foreignTable: Table
– препращаната таблица$localColumns: Column[]
– масив от локални колони$foreignColumns: Column[]
– масив от препратени колони$name: ?string
– име на външния ключ
// Изписване на чужди ключове
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";
}