Reflexe
A Nette Database eszközöket biztosít az adatbázisok szerkezetének áttekintéséhez a Nette\Database\Reflection\Reflection osztály segítségével. Ez lehetővé teszi a táblákról, oszlopokról, indexekről és idegen kulcsokról szóló információk lekérdezését. A reflexió használható séma generálására, rugalmas adatbázis-vezérelt alkalmazások létrehozására vagy általános adatbázis-eszközök létrehozására.
A reflection objektumot egy adatbázis-kapcsolati példányból szerezheti meg:
$reflection = $connection->getReflection();
Munka táblázatokkal
A tükrözés segítségével az adatbázis összes tábláját böngészhetjük:
getTables(): Nette\Database\Reflection\Table[]
Egy asszociatív tömböt ad vissza, ahol a kulcs a táblázat neve, az érték pedig a táblázat metaadatainak tömbje.
// Az összes táblázat nevének listázása
foreach ($reflection->getTables() as $table) {
echo $table['name'] . "\n";
}
hasTable(string $name): bool
Visszaadja a true
értéket, ha a tábla létezik, egyébként false
.
// A táblázat létezésének ellenőrzése
if ($reflection->hasTable('users')) {
echo "The 'users' table exists";
}
getTable(string $name): Nette\Database\Reflection\Table
Visszaadja az adott táblázatot reprezentáló Nette\Database\Reflection\Table
objektumot. Ha a táblázat nem
létezik, akkor kivételt dob Nette\Database\Exception\MissingTableException
.
// Egy adott táblázat lekérdezése
$table = $reflection->getTable('users');
Információk az oszlopokról
A Nette\Database\Reflection\Table
objektum, amelyet a getTable()
meghívásával kapunk, lehetővé teszi a táblázat oszlopaira vonatkozó részletes
információk lekérdezését.
getColumns(): Nette\Database\Reflection\Column[]
A táblázat oszlopait reprezentáló Nette\Database\Reflection\Column
objektumok tömbjét adja vissza.
getColumn(string $name): Nette\Database\Reflection\Column
Visszaadja az adott oszlopot reprezentáló Nette\Database\Reflection\Column objektumot.
Ha az oszlop nem létezik, akkor kivételt dob Nette\Database\Exception\MissingColumnException
.
A Column
objektum a következő tulajdonságokkal rendelkezik:
name
: Az oszlop neve.nativeType
: Az adatbázis-specifikus oszlop adattípusa.type
: Az oszlop normalizált adattípusa (lásd aNette\Utils\Type
konstansokat).nullable
:true
, ha az oszlop tartalmazhatja aNULL
, egyébkéntfalse
.primary
:true
, ha az oszlop az elsődleges kulcs része, egyébkéntfalse
.autoIncrement
:true
ha az oszlop automatikusan növelhető, egyébkéntfalse
.default
: Az oszlop alapértelmezett értéke, vagynull
, ha nincs definiálva.vendor
: További adatbázis-specifikus információkat tartalmazó tömb.
// A 'users' tábla összes oszlopán való ismételt végigfutás
$table = $reflection->getTable('users');
foreach ($table->getColumns() as $column) {
echo "Column: " . $column->name . "\n";
echo "Type: " . $column->nativeType . "\n";
echo "Allows NULL: " . ($column->nullable ? 'Yes': 'No') . "\n";
echo "Default value: " . ($column->default ?? 'None') . "\n";
echo "Is primary key: " . ($column->primary ? 'Yes': 'No') . "\n";
echo "Is auto-increment: " . ($column->autoIncrement ? 'Yes': 'No') . "\n";
}
// Egy adott oszlop lekérdezése
$idColumn = $table->getColumn('id');
Indexek és elsődleges kulcsok
getIndexes(): Nette\Database\Reflection\Index[]
Visszaad egy Nette\Database\Reflection\Index
objektumokból álló tömböt, amely a táblázat indexeit
reprezentálja.
getIndex(string $name): Nette\Database\Reflection\Index
Visszaadja az adott indexet reprezentáló Nette\Database\Reflection\Index objektumot. Ha
az index nem létezik, akkor kivételt dob Nette\Database\Exception\MissingIndexException
.
getPrimaryKey(): ?Nette\Database\Reflection\Index
Visszaadja a Nette\Database\Reflection\Index
objektumot, amely a tábla elsődleges kulcsát képviseli, vagy a
null
objektumot, ha a táblának nincs elsődleges kulcsa.
A Index
objektum a következő tulajdonságokkal rendelkezik:
name
: Az index neve.columns
: Az index részét képező oszlopokat ábrázolóNette\Database\Reflection\Column
objektumok tömbje.unique
:true
ha az index egyedi, egyébkéntfalse
.primary
:true
ha az index az elsődleges kulcs, egyébkéntfalse
.
$table = $reflection->getTable('users');
$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));
// Az összes index listázása
foreach ($table->getIndexes() as $index) {
echo "Index: " . ($index->name ?? 'Unnamed') . "\n";
echo "Columns: " . $printColumnNames($index->columns) . "\n";
echo "Is unique: " . ($index->unique ? 'Yes': 'No') . "\n";
echo "Is primary key: " . ($index->primary ? 'Yes': 'No') . "\n";
}
// Az elsődleges kulcs lekérdezése
if ($primaryKey = $table->getPrimaryKey()) {
echo "Primary key: " . $printColumnNames($primaryKey->columns) . "\n";
}
Idegen kulcsok
getForeignKeys(): Nette\Database\Reflection\ForeignKey[]
Visszaad egy Nette\Database\Reflection\ForeignKey
objektumokból álló tömböt, amely a táblázat idegen
kulcsait reprezentálja.
getForeignKey(string $name): Nette\Database\Reflection\ForeignKey
Visszaadja az adott idegen kulcsot reprezentáló Nette\Database\Reflection\ForeignKey
objektumot. Ha az idegen kulcs nem létezik, akkor kivételt dob
Nette\Database\Exception\MissingForeignKeyException
.
A ForeignKey
objektum a következő tulajdonságokkal rendelkezik:
name
: Az idegen kulcs neve.localColumns
: Az idegen kulcsot alkotó helyi oszlopokat reprezentálóNette\Database\Reflection\Column
objektumok tömbje.foreignTable
: ANette\Database\Reflection\Table
objektum, amely az idegen kulcs által hivatkozott idegen táblát ábrázolja.foreignColumns
: Az idegen kulcs által hivatkozott idegen oszlopokat reprezentálóNette\Database\Reflection\Column
objektumok tömbje.
$table = $reflection->getTable('books');
$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));
foreach ($table->getForeignKeys() as $fk) {
echo "Foreign key: " . ($fk->name ?? 'Unnamed') . "\n";
echo "Local columns: " . $printColumnNames($fk->localColumns) . "\n";
echo "References table: {$fk->foreignTable->name}\n";
echo "References columns: " . $printColumnNames($fk->foreignColumns) . "\n";
}