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