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

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