Отражение структуры
Nette Database предоставляет инструменты для изучения структуры базы данных с помощью класса Nette\Database\Reflection. Это позволяет получать информацию о таблицах, столбцах, индексах и внешних ключах. Вы можете использовать отражение для генерации схем, создания гибких приложений баз данных или создания общих инструментов баз данных.
Объект отражения можно получить из экземпляра соединения с базой данных:
$reflection = $database->getReflection();
Извлечение таблиц
Свойство $reflection->tables
, доступное только для чтения,
предоставляет ассоциативный массив всех таблиц в базе данных:
// Перечисление имен всех таблиц
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Имеется два дополнительных метода:
// Проверьте, существует ли таблица
if ($reflection->hasTable('users')) {
echo "The 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[]
– массив внешних ключей таблицы
Столбцы
Свойство 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 "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";
}