Рефлексия на структурата
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";
}