Отражение структуры

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