Рефлексія структури
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
– чи є це представленням (view)$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 "Стовпець: $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";
}