Відображення структури
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 "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";
}