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