-
-
Notifications
You must be signed in to change notification settings - Fork 277
Expand file tree
/
Copy pathreflection.texy
More file actions
125 lines (93 loc) · 6.22 KB
/
reflection.texy
File metadata and controls
125 lines (93 loc) · 6.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
Рефлексия структуры
*******************
.{data-version:3.2.1}
Nette Database предоставляет инструменты для интроспекции структуры базы данных с помощью класса [api:Nette\Database\Reflection]. Он позволяет получать информацию о таблицах, столбцах, индексах и внешних ключах. Рефлексию можно использовать для генерации схем, создания гибких приложений, работающих с базой данных, или общих инструментов для работы с базами данных.
Объект рефлексии можно получить из экземпляра подключения к базе данных:
```php
$reflection = $database->getReflection();
```
Получение таблиц
----------------
Свойство только для чтения `$reflection->tables` содержит ассоциативный массив всех таблиц в базе данных:
```php
// Вывод имен всех таблиц
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
```
Доступны еще два метода:
```php
// Проверка существования таблицы
if ($reflection->hasTable('users')) {
echo "Таблица users существует";
}
// Возвращает объект таблицы; если не существует, выбрасывает исключение
$table = $reflection->getTable('users');
```
Информация о таблице
--------------------
Таблица представлена объектом [Table|api:Nette\Database\Reflection\Table], который предоставляет следующие свойства только для чтения:
- `$name: string` – имя таблицы
- `$view: bool` – является ли представлением
- `$fullName: ?string` – полное имя таблицы, включая схему (БД) (если существует)
- `$columns: array<string, Column>` – ассоциативный массив столбцов таблицы
- `$indexes: Index[]` – массив индексов таблицы
- `$primaryKey: ?Index` – первичный ключ таблицы или null
- `$foreignKeys: ForeignKey[]` – массив внешних ключей таблицы
Столбцы
-------
Свойство `columns` таблицы предоставляет ассоциативный массив столбцов, где ключом является имя столбца, а значением — экземпляр [Column|api:Nette\Database\Reflection\Column] со следующими свойствами:
- `$name: string` – имя столбца
- `$table: ?Table` – ссылка на таблицу столбца
- `$nativeType: string` – нативный тип данных базы данных
- `$size: ?int` – размер/длина типа
- `$nullable: bool` – может ли столбец содержать NULL
- `$default: mixed` – значение по умолчанию столбца
- `$autoIncrement: bool` – является ли столбец автоинкрементным
- `$primary: bool` – является ли частью первичного ключа
- `$vendor: array` – дополнительные метаданные, специфичные для данной системы баз данных
```php
foreach ($table->columns as $name => $column) {
echo "Столбец: $name\n";
echo "Тип: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Да' : 'Нет') . "\n";
}
```
Индексы
-------
Свойство `indexes` таблицы предоставляет массив индексов, где каждый индекс является экземпляром [Index|api:Nette\Database\Reflection\Index] со следующими свойствами:
- `$columns: Column[]` – массив столбцов, составляющих индекс
- `$unique: bool` – является ли индекс уникальным
- `$primary: bool` – является ли первичным ключом
- `$name: ?string` – имя индекса
Первичный ключ таблицы можно получить с помощью свойства `primaryKey`, которое возвращает либо объект `Index`, либо `null` в случае, если таблица не имеет первичного ключа.
```php
// Вывод индексов
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|api:Nette\Database\Reflection\ForeignKey] со следующими свойствами:
- `$foreignTable: Table` – таблица, на которую ссылается ключ
- `$localColumns: Column[]` – массив локальных столбцов
- `$foreignColumns: Column[]` – массив столбцов, на которые ссылается ключ
- `$name: ?string` – имя внешнего ключа
```php
// Вывод внешних ключей
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";
}
```