Reflexe

Nette Database предоставя инструменти за интроспекция на структурата на базата данни, използвайки класа Nette\Database\Reflection\Reflection. Това ви позволява да извличате информация за таблици, колони, индекси и външни ключове. Отразяването може да се използва за генериране на схеми, създаване на гъвкави приложения, управлявани от бази данни, или общи инструменти за бази данни.

Можете да получите обекта за отразяване от инстанция за връзка с база данни:

$reflection = $connection->getReflection();

Работа с таблици

С помощта на отражението можем да прегледаме всички таблици в базата данни:

getTables(): Nette\Database\Reflection\Table[]

Връща асоциативен масив, в който ключът е името на таблицата, а стойността е масив от метаданни за таблицата.

// Изписване на имената на всички таблици
foreach ($reflection->getTables() as $table) {
	echo $table['name'] . "\n";
}

hasTable (string $name): bool

Връща true, ако таблицата съществува, в противен случай false.

// Проверка на съществуването на таблица
if ($reflection->hasTable('users')) {
	echo "The 'users' table exists";
}

getTable (string $name): Nette\Database\Reflection\Table

Връща обекта Nette\Database\Reflection\Table, представляващ дадената таблица. Ако таблицата не съществува, се хвърля изключение Nette\Database\Exception\MissingTableException.

// Извличане на определена таблица
$table = $reflection->getTable('users');

Информация за колоните

Обектът Nette\Database\Reflection\Table, получен чрез извикване на getTable(), ви позволява да извличате подробна информация за колоните на таблицата.

getColumns(): Nette\Database\Reflection\Column[]

Връща масив от обекти Nette\Database\Reflection\Column, представляващи колоните на таблицата.

getColumn (string $name): Nette\Database\Reflection\Column

Връща обекта Nette\Database\Reflection\Column, представляващ дадената колона. Ако колоната не съществува, се хвърля изключение Nette\Database\Exception\MissingColumnException.

Обектът Column предоставя следните свойства:

  • name: Името на колоната.
  • nativeType: Специфичният за базата данни тип данни на колоната.
  • type: Нормализираният тип данни на колоната (вижте константите Nette\Utils\Type).
  • nullable: true, ако колоната може да съдържа NULL, в противен случай false.
  • primary: true, ако колоната е част от първичния ключ, в противен случай false.
  • autoIncrement: true, ако колоната е автоматично увеличаваща се, в противен случай false.
  • default: Стойност по подразбиране на колоната или null, ако не е дефинирана.
  • vendor: Масив с допълнителна информация, специфична за базата данни.
// Итериране през всички колони в таблицата "users
$table = $reflection->getTable('users');
foreach ($table->getColumns() as $column) {
	echo "Column: " . $column->name . "\n";
	echo "Type: " . $column->nativeType . "\n";
	echo "Allows NULL: " . ($column->nullable ? 'Yes': 'No') . "\n";
	echo "Default value: " . ($column->default ?? 'None') . "\n";
	echo "Is primary key: " . ($column->primary ? 'Yes': 'No') . "\n";
	echo "Is auto-increment: " . ($column->autoIncrement ? 'Yes': 'No') . "\n";
}

// Извличане на конкретна колона
$idColumn = $table->getColumn('id');

Индекси и първични ключове

getIndexes(): Nette\Database\Reflection\Index[]

Връща масив от обекти Nette\Database\Reflection\Index, представляващи индексите на таблицата.

getIndex (string $name): Nette\Database\Reflection\Index

Връща обекта Nette\Database\Reflection\Index, представляващ дадения индекс. Ако индексът не съществува, се хвърля изключение Nette\Database\Exception\MissingIndexException.

getPrimaryKey(): ?Nette\Database\Reflection\Index

Връща обекта Nette\Database\Reflection\Index, представляващ първичния ключ на таблицата, или null, ако таблицата няма първичен ключ.

Обектът Index предоставя следните свойства:

  • name: Името на индекса.
  • columns: Масив от обекти Nette\Database\Reflection\Column, представляващи колоните, които са част от индекса.
  • unique: true, ако индексът е уникален, в противен случай false.
  • primary: true ако индексът е първичен ключ, в противен случай false.
$table = $reflection->getTable('users');

$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));

// Изписване на всички индекси
foreach ($table->getIndexes() as $index) {
	echo "Index: " . ($index->name ?? 'Unnamed') . "\n";
	echo "Columns: " . $printColumnNames($index->columns) . "\n";
	echo "Is unique: " . ($index->unique ? 'Yes': 'No') . "\n";
	echo "Is primary key: " . ($index->primary ? 'Yes': 'No') . "\n";
}

// Извличане на първичния ключ
if ($primaryKey = $table->getPrimaryKey()) {
	echo "Primary key: " . $printColumnNames($primaryKey->columns) . "\n";
}

Чужди ключове

getForeignKeys(): Nette\Database\Reflection\ForeignKey[]

Връща масив от обекти Nette\Database\Reflection\ForeignKey, представляващи външните ключове на таблицата.

getForeignKey (string $name): Nette\Database\Reflection\ForeignKey

Връща обекта Nette\Database\Reflection\ForeignKey, представляващ дадения външен ключ. Ако чуждият ключ не съществува, се хвърля изключение Nette\Database\Exception\MissingForeignKeyException.

Обектът ForeignKey предоставя следните свойства:

  • name: Името на външния ключ.
  • localColumns: Масив от Nette\Database\Reflection\Column обекти, представляващи локалните колони, които съставляват външния ключ.
  • foreignTable: Обект Nette\Database\Reflection\Table, представляващ външната таблица, към която се отнася външният ключ.
  • foreignColumns: Масив от Nette\Database\Reflection\Column обекти, представляващи чуждите колони, на които се позовава чуждият ключ.
$table = $reflection->getTable('books');

$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));

foreach ($table->getForeignKeys() as $fk) {
	echo "Foreign key: " . ($fk->name ?? 'Unnamed') . "\n";
	echo "Local columns: " . $printColumnNames($fk->localColumns) . "\n";
	echo "References table: {$fk->foreignTable->name}\n";
	echo "References columns: " . $printColumnNames($fk->foreignColumns) . "\n";
}