Рефлексия структуры

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";
}
версия: 4.0