Рефлексия на структурата
Nette Database предоставя инструменти за интроспекция на структурата на базата данни с помощта на класа Nette\Database\Reflection. Тя позволява получаване на информация за таблици, колони, индекси и външни ключове. Можете да използвате рефлексията за генериране на схеми, създаване на гъвкави приложения, работещи с база данни, или общи инструменти за бази данни.
Получаваме обекта на рефлексията от инстанцията на връзката с базата данни:
$reflection = $database->getReflection();
Получаване на таблици
Readonly свойството $reflection->tables
съдържа асоциативен масив на
всички таблици в базата данни:
// Извеждане на имената на всички таблици
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Налични са още два метода:
// Проверка за съществуване на таблица
if ($reflection->hasTable('users')) {
echo "Таблицата users съществува";
}
// Връща обект на таблицата; ако не съществува, хвърля изключение
$table = $reflection->getTable('users');
Информация за таблицата
Таблицата е представена от обект Table, който предоставя следните readonly свойства:
$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
– дали колоната е auto-increment$primary: bool
– дали е част от първичния ключ$vendor: array
– допълнителни метаданни, специфични за дадената система за бази данни
foreach ($table->columns as $name => $column) {
echo "Колона: $name\n";
echo "Тип: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Да' : 'Не') . "\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->name ? " {$index->name}" : '') . ":\n";
echo " Колони: $columns\n";
echo " Unique: " . ($index->unique ? 'Да' : 'Не') . "\n";
}
// Извеждане на първичния ключ
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Първичен ключ: $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";
}