Yapı Reflection'ı
Nette Database, Nette\Database\Reflection sınıfıyla veritabanı yapısını incelemeye yarayan araçlar sunar. Tablolar, sütunlar, indeksler ve yabancı anahtarlar hakkında bilgi almanızı sağlar. Reflection'ı şema üretmek, veritabanıyla çalışan esnek uygulamalar ya da genel amaçlı veritabanı araçları yazmak için kullanabilirsiniz.
Reflection nesnesi, veritabanı bağlantısı örneğinden alınır:
$reflection = $database->getReflection();
Tabloları Alma
Salt okunur $reflection->tables özelliği, veritabanındaki tüm tabloların ilişkisel bir dizisini
içerir:
// Tüm tabloların adlarını listeleme
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
İki metot daha vardır:
// Bir tablonun varlığını denetleme
if ($reflection->hasTable('users')) {
echo "Table users exists";
}
// Tablo nesnesini döndürür; yoksa istisna fırlatır
$table = $reflection->getTable('users');
Tablo Bilgisi
Bir tablo, şu salt okunur özellikleri sunan Table nesnesiyle temsil edilir:
$name: string– tablonun adı$view: bool– bir view olup olmadığı$fullName: ?string– şema dahil tablonun tam adı (varsa)$columns: array<string, Column>– tablo sütunlarının ilişkisel dizisi$indexes: Index[]– tablo indekslerinin dizisi$primaryKey: ?Index– tablonun birincil anahtarı ya da null$foreignKeys: ForeignKey[]– tablonun yabancı anahtarlarının dizisi$comment: ?string– tablonun yorumu
Sütunlar
Tablonun columns özelliği, anahtarın sütun adı, değerin ise şu özelliklere sahip bir Column örneği olduğu ilişkisel bir
sütun dizisi sunar:
$name: string– sütunun adı$table: ?Table– sütunun tablosuna referans$nativeType: string– veritabanının yerel türü$size: ?int– türün boyutu/uzunluğu$nullable: bool– sütunun NULL içerip içeremeyeceği$default: mixed– sütunun varsayılan değeri$autoIncrement: bool– sütunun auto-increment olup olmadığı$primary: bool– birincil anahtarın parçası olup olmadığı$vendor: array– ilgili veritabanı sistemine özgü ek meta veriler$comment: ?string– sütunun yorumu
foreach ($table->columns as $name => $column) {
echo "Column: $name\n";
echo "Type: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Yes' : 'No') . "\n";
}
İndeksler
Tablonun indexes özelliği, her indeksin şu özelliklere sahip bir Index örneği olduğu bir indeks
dizisi sunar:
$columns: Column[]– indeksi oluşturan sütunların dizisi$unique: bool– indeksin benzersiz olup olmadığı$primary: bool– birincil anahtar olup olmadığı$name: ?string– indeksin adı
Tablonun birincil anahtarı primaryKey özelliğiyle alınabilir; bu özellik ya bir Index nesnesi ya
da tablonun birincil anahtarı yoksa null döndürür.
// İndeksleri listeleme
foreach ($table->indexes as $index) {
$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
echo "Index" . ($index->name ? " {$index->name}" : '') . ":\n";
echo " Columns: $columns\n";
echo " Unique: " . ($index->unique ? 'Yes' : 'No') . "\n";
}
// Birincil anahtarı listeleme
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Primary Key: $columns\n";
}
Yabancı Anahtarlar
Tablonun foreignKeys özelliği, her yabancı anahtarın şu özelliklere sahip bir ForeignKey örneği olduğu bir
yabancı anahtar dizisi sunar:
$foreignTable: Table– başvurulan tablo$localColumns: Column[]– yerel sütunların dizisi$foreignColumns: Column[]– başvurulan sütunların dizisi$name: string– yabancı anahtarın adı
// Yabancı anahtarları listeleme
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";
}