構造リフレクション
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"; }