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