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

さらに2つのメソッドが利用可能です:

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

さらに2つのメソッドが利用可能です:

// テーブルの存在確認
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";
}