[Go to site: main page, start]

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

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