Reflexia structurii

Nette Database oferă instrumente pentru introspecția structurii bazei de date folosind clasa Nette\Database\Structure. Aceasta permite obținerea de informații despre tabele, coloane, indecși și chei străine. Puteți utiliza reflexia pentru a genera scheme, a crea aplicații flexibile care lucrează cu baza de date sau instrumente generale pentru baze de date.

Obținem obiectul structurii din instanța conexiunii la baza de date:

$reflection = $database->getReflection();

Obținerea tabelelor

Metoda getTables() returnează un array cu informații despre toate tabelele:

// Listarea numelor tuturor tabelelor
foreach ($structure->getTables() as $table) {
	echo $table['name'] . "\n";
}

Sunt disponibile încă două metode:

// Verificarea existenței tabelului
if ($reflection->hasTable('users')) {
	echo "Tabelul users există";
}

// Returnează obiectul tabelului; dacă nu există, aruncă o excepție
$table = $reflection->getTable('users');

Informații despre tabel

Tabelul este reprezentat de obiectul Table, care oferă următoarele proprietăți readonly:

  • $name: string – numele tabelului
  • $view: bool – dacă este o vizualizare
  • $fullName: ?string – numele complet al tabelului, inclusiv schema (dacă există)
  • $columns: array<string, Column> – array asociativ al coloanelor tabelului
  • $indexes: Index[] – array de indecși ai tabelului
  • $primaryKey: ?Index – cheia primară a tabelului sau null
  • $foreignKeys: ForeignKey[] – array de chei străine ale tabelului

Coloane

Proprietatea columns a tabelului oferă un array asociativ de coloane, unde cheia este numele coloanei și valoarea este o instanță Column cu aceste proprietăți:

  • $name: string – numele coloanei
  • $table: ?Table – referință la tabelul coloanei
  • $nativeType: string – tipul de date nativ al bazei de date
  • $size: ?int – dimensiunea/lungimea tipului
  • $nullable: bool – dacă coloana poate conține NULL
  • $default: mixed – valoarea implicită a coloanei
  • $autoIncrement: bool – dacă coloana este auto-increment
  • $primary: bool – dacă face parte din cheia primară
  • $vendor: array – metadate suplimentare specifice sistemului de baze de date respectiv
foreach ($table->columns as $name => $column) {
	echo "Coloană: $name\n";
	echo "Tip: {$column->nativeType}\n";
	echo "Nullable: " . ($column->nullable ? 'Da' : 'Nu') . "\n";
}

Indecși

Proprietatea indexes a tabelului oferă un array de indecși, unde fiecare index este o instanță Index cu aceste proprietăți:

  • $columns: Column[] – array de coloane care formează indexul
  • $unique: bool – dacă indexul este unic
  • $primary: bool – dacă este cheia primară
  • $name: ?string – numele indexului

Cheia primară a tabelului poate fi obținută folosind proprietatea primaryKey, care returnează fie un obiect Index, fie null în cazul în care tabelul nu are cheie primară.

// Listarea indecșilor
foreach ($table->indexes as $index) {
	$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
	echo "Index" . ($index->name ? " {$index->name}" : '') . ":\n";
	echo "  Coloane: $columns\n";
	echo "  Unic: " . ($index->unique ? 'Da' : 'Nu') . "\n";
}

// Listarea cheii primare
if ($primaryKey = $table->primaryKey) {
	$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
	echo "Cheie primară: $columns\n";
}

Chei străine

Proprietatea foreignKeys a tabelului oferă un array de chei străine, unde fiecare cheie străină este o instanță ForeignKey cu aceste proprietăți:

  • $foreignTable: Table – tabelul referit
  • $localColumns: Column[] – array de coloane locale
  • $foreignColumns: Column[] – array de coloane referite
  • $name: ?string – numele cheii străine
// Listarea cheilor străine
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";
}
versiune: 4.0