構造リフレクション

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";
}
バージョン: 4.0