Рефлексия на структурата

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 – дали колоната е auto-increment
  • $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