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