Рефлексия структуры
Nette Database предоставляет инструменты для исследования структуры базы данных через класс Nette\Database\Reflection. Он позволяет получать сведения о таблицах, столбцах, индексах и внешних ключах. Рефлексию можно использовать для порождения схем, создания гибких приложений, работающих с базой данных, или для общих инструментов работы с базами.
Объект рефлексии получают из экземпляра соединения с базой данных:
$reflection = $database->getReflection();
Получение таблиц
Свойство только для чтения $reflection->tables содержит
ассоциативный массив всех таблиц базы данных:
// Вывод имён всех таблиц
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Доступны ещё два метода:
// Проверка существования таблицы
if ($reflection->hasTable('users')) {
echo "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[]– массив внешних ключей таблицы$comment: ?string– комментарий таблицы
Столбцы
Свойство таблицы columns предоставляет ассоциативный массив
столбцов, где ключом служит имя столбца, а значением – экземпляр Column с такими
свойствами:
$name: string– имя столбца$table: ?Table– ссылка на таблицу столбца$nativeType: string– нативный тип базы данных$size: ?int– размер или длина типа$nullable: bool– может ли столбец содержать NULL$default: mixed– значение столбца по умолчанию$autoIncrement: bool– является ли столбец автоинкрементным$primary: bool– входит ли он в первичный ключ$vendor: array– дополнительные метаданные, специфичные для данной СУБД$comment: ?string– комментарий столбца
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";
}