Struktúra reflexió
A Nette Database eszközöket biztosít az adatbázis struktúrájának introspekciójához a Nette\Database\Reflection osztály segítségével. Ez lehetővé teszi információk lekérését táblákról, oszlopokról, indexekről és idegen kulcsokról. A reflexiót használhatja sémák generálásához, rugalmas, adatbázissal dolgozó alkalmazások létrehozásához vagy általános adatbázis-eszközök készítéséhez.
A reflexiós objektumot az adatbázis-kapcsolat példányából kapjuk meg:
$reflection = $database->getReflection();
Táblák lekérése
A $reflection->tables
readonly property tartalmazza az adatbázis összes táblájának asszociatív
tömbjét:
// Az összes tábla nevének kiírása
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Két további metódus is rendelkezésre áll:
// Tábla létezésének ellenőrzése
if ($reflection->hasTable('users')) {
echo "A users tábla létezik";
}
// Visszaadja a tábla objektumot; ha nem létezik, kivételt dob
$table = $reflection->getTable('users');
Információ a tábláról
A táblát egy Table objektum reprezentálja, amely a következő readonly property-ket biztosítja:
$name: string
– tábla neve$view: bool
– hogy nézetről van-e szó$fullName: ?string
– a tábla teljes neve, beleértve a sémát (ha létezik)$columns: array<string, Column>
– a tábla oszlopainak asszociatív tömbje$indexes: Index[]
– a tábla indexeinek tömbje$primaryKey: ?Index
– a tábla elsődleges kulcsa vagy null$foreignKeys: ForeignKey[]
– a tábla idegen kulcsainak tömbje
Oszlopok
A tábla columns
property-je az oszlopok asszociatív tömbjét adja meg, ahol a kulcs az oszlop neve, az érték
pedig egy Column példány a következő
property-kkel:
$name: string
– oszlop neve$table: ?Table
– referencia az oszlop táblájára$nativeType: string
– natív adatbázis típus$size: ?int
– a típus mérete/hossza$nullable: bool
– hogy az oszlop tartalmazhat-e NULL-t$default: mixed
– az oszlop alapértelmezett értéke$autoIncrement: bool
– hogy az oszlop auto-increment-e$primary: bool
– hogy része-e az elsődleges kulcsnak$vendor: array
– további, az adott adatbázis-rendszerre specifikus metaadatok
foreach ($table->columns as $name => $column) {
echo "Oszlop: $name\n";
echo "Típus: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Igen' : 'Nem') . "\n";
}
Indexek
A tábla indexes
property-je az indexek tömbjét adja meg, ahol minden index egy Index példány a következő
property-kkel:
$columns: Column[]
– az indexet alkotó oszlopok tömbje$unique: bool
– hogy az index egyedi-e$primary: bool
– hogy elsődleges kulcsról van-e szó$name: ?string
– az index neve
A tábla elsődleges kulcsát a primaryKey
property segítségével lehet lekérni, amely vagy egy
Index
objektumot ad vissza, vagy null
-t, ha a táblának nincs elsődleges kulcsa.
// Indexek kiírása
foreach ($table->indexes as $index) {
$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
echo "Index" . ($index->name ? " {$index->name}" : '') . ":\n";
echo " Oszlopok: $columns\n";
echo " Unique: " . ($index->unique ? 'Igen' : 'Nem') . "\n";
}
// Elsődleges kulcs kiírása
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Elsődleges kulcs: $columns\n";
}
Idegen kulcsok
A tábla foreignKeys
property-je az idegen kulcsok tömbjét adja meg, ahol minden idegen kulcs egy ForeignKey példány a következő
property-kkel:
$foreignTable: Table
– a hivatkozott tábla$localColumns: Column[]
– a helyi oszlopok tömbje$foreignColumns: Column[]
– a hivatkozott oszlopok tömbje$name: ?string
– az idegen kulcs neve
// Idegen kulcsok kiírása
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";
}