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";
}