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 "Таблица 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";
}
```

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

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

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

$reflection = $database->getReflection();

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

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

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

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

// Проверка существования таблицы
if ($reflection->hasTable('users')) {
	echo "Таблица users существует";
}

// Возвращает объект таблицы; если не существует, выбрасывает исключение
$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 "Столбец: $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";
}