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