Nette Documentation Preview

syntax
Рефлексия структуры
*******************

.{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 "Table users exists";
}

// Возвращает объект таблицы; выбрасывает исключение, если её нет
$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[]` - массив внешних ключей таблицы
- `$comment: ?string` - комментарий таблицы


Столбцы
-------

Свойство таблицы `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` - дополнительные метаданные, специфичные для данной СУБД
- `$comment: ?string` - комментарий столбца

```php
foreach ($table->columns as $name => $column) {
	echo "Column: $name\n";
	echo "Type: {$column->nativeType}\n";
	echo "Nullable: " . ($column->nullable ? 'Yes' : 'No') . "\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" . ($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|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";
}
```

Рефлексия структуры

Nette Database предоставляет инструменты для исследования структуры базы данных через класс Nette\Database\Reflection. Он позволяет получать сведения о таблицах, столбцах, индексах и внешних ключах. Рефлексию можно использовать для порождения схем, создания гибких приложений, работающих с базой данных, или для общих инструментов работы с базами.

Объект рефлексии получают из экземпляра соединения с базой данных:

$reflection = $database->getReflection();

Получение таблиц

Свойство только для чтения $reflection->tables содержит ассоциативный массив всех таблиц базы данных:

// Вывод имён всех таблиц
foreach ($reflection->tables as $name => $table) {
	echo $name . "\n";
}

Доступны ещё два метода:

// Проверка существования таблицы
if ($reflection->hasTable('users')) {
	echo "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[] – массив внешних ключей таблицы
  • $comment: ?string – комментарий таблицы

Столбцы

Свойство таблицы columns предоставляет ассоциативный массив столбцов, где ключом служит имя столбца, а значением – экземпляр Column с такими свойствами:

  • $name: string – имя столбца
  • $table: ?Table – ссылка на таблицу столбца
  • $nativeType: string – нативный тип базы данных
  • $size: ?int – размер или длина типа
  • $nullable: bool – может ли столбец содержать NULL
  • $default: mixed – значение столбца по умолчанию
  • $autoIncrement: bool – является ли столбец автоинкрементным
  • $primary: bool – входит ли он в первичный ключ
  • $vendor: array – дополнительные метаданные, специфичные для данной СУБД
  • $comment: ?string – комментарий столбца
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";
}