Reflexe
Nette Database oferă instrumente pentru introspecția structurii bazei de date utilizând clasa Nette\Database\Reflection\Reflection. Aceasta vă permite să obțineți informații despre tabele, coloane, indexuri și chei străine. Reflection poate fi utilizat pentru generarea de scheme, crearea de aplicații flexibile bazate pe baze de date sau instrumente generale pentru baze de date.
Puteți obține obiectul reflection de la o instanță de conexiune la baza de date:
$reflection = $connection->getReflection();
Lucrul cu tabelele
Folosind reflection putem parcurge toate tabelele din baza de date:
getTables(): Nette\Database\Reflection\Table[]
Returnează un array asociativ în care cheia este numele tabelului, iar valoarea este un array de metadate ale tabelului.
// Listarea numelor tuturor tabelelor
foreach ($reflection->getTables() as $table) {
echo $table['name'] . "\n";
}
hasTable(string $name): bool
Returnează true
dacă tabelul există, altfel false
.
// Verificarea existenței tabelelor
if ($reflection->hasTable('users')) {
echo "The 'users' table exists";
}
getTable(string $name): Nette\Database\Reflection\Table
Returnează obiectul Nette\Database\Reflection\Table
care reprezintă tabelul dat. Dacă tabelul nu există, se
aruncă o excepție Nette\Database\Exception\MissingTableException
.
// Recuperarea unui anumit tabel
$table = $reflection->getTable('users');
Informații despre coloane
Obiectul Nette\Database\Reflection\Table,
obținut prin apelarea getTable()
, vă permite să obțineți informații detaliate despre coloanele tabelului.
getColumns(): Nette\Database\Reflection\Column[]
Returnează o matrice de obiecte Nette\Database\Reflection\Column
reprezentând coloanele tabelului.
getColumn(string $name): Nette\Database\Reflection\Column
Returnează obiectul Nette\Database\Reflection\Column care
reprezintă coloana dată. Dacă coloana nu există, se aruncă o excepție
Nette\Database\Exception\MissingColumnException
.
Obiectul Column
oferă următoarele proprietăți:
name
: Numele coloanei.nativeType
: Tipul de date al coloanei specific bazei de date.type
: Tipul de date normalizat al coloanei (a se vedea constanteleNette\Utils\Type
).nullable
:true
dacă coloana poate conțineNULL
, altfelfalse
.primary
:true
dacă coloana face parte din cheia primară, altfelfalse
.autoIncrement
:true
dacă coloana este auto-increment, altfelfalse
.default
: Valoarea implicită a coloanei saunull
dacă nu este definită.vendor
: Un array cu informații suplimentare specifice bazei de date.
// Iterarea prin toate coloanele din tabelul "users
$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";
}
// Recuperarea unei anumite coloane
$idColumn = $table->getColumn('id');
Indicii și cheile primare
getIndexes(): Nette\Database\Reflection\Index[]
Returnează o matrice de obiecte Nette\Database\Reflection\Index
care reprezintă indexurile de tabel.
getIndex(string $name): Nette\Database\Reflection\Index
Returnează obiectul Nette\Database\Reflection\Index care
reprezintă indexul dat. Dacă indexul nu există, se aruncă o excepție
Nette\Database\Exception\MissingIndexException
.
getPrimaryKey(): ?Nette\Database\Reflection\Index
Returnează obiectul Nette\Database\Reflection\Index
care reprezintă cheia primară a tabelului sau
null
dacă tabelul nu are cheie primară.
Obiectul Index
oferă următoarele proprietăți:
name
: Numele indexului.columns
: O matrice de obiecteNette\Database\Reflection\Column
reprezentând coloanele care fac parte din index.unique
:true
dacă indexul este unic, altfelfalse
.primary
:true
dacă indexul este cheia primară, altfelfalse
.
$table = $reflection->getTable('users');
$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));
// Listarea tuturor indexurilor
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";
}
// Recuperarea cheii primare
if ($primaryKey = $table->getPrimaryKey()) {
echo "Primary key: " . $printColumnNames($primaryKey->columns) . "\n";
}
Chei străine
getForeignKeys(): Nette\Database\Reflection\ForeignKey[]
Returnează o matrice de obiecte Nette\Database\Reflection\ForeignKey
reprezentând cheile străine ale
tabelului.
getForeignKey(string $name): Nette\Database\Reflection\ForeignKey
Returnează obiectul Nette\Database\Reflection\ForeignKey care
reprezintă cheia externă dată. Dacă cheia străină nu există, se aruncă o excepție
Nette\Database\Exception\MissingForeignKeyException
.
Obiectul ForeignKey
oferă următoarele proprietăți:
name
: Numele cheii străine.localColumns
: O matrice de obiecteNette\Database\Reflection\Column
care reprezintă coloanele locale care alcătuiesc cheia străină.foreignTable
: Un obiectNette\Database\Reflection\Table
care reprezintă tabelul străin la care face trimitere cheia străină.foreignColumns
: O matrice de obiecteNette\Database\Reflection\Column
reprezentând coloanele străine la care face trimitere cheia străină.
$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";
}