Рефлексия структуры
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
– является ли столбец автоинкрементным$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";
}