Reflectarea structurii

Nette Database oferă instrumente pentru inspectarea structurilor bazelor de date prin clasa Nette\Database\Reflection. Aceasta vă permite să obțineți informații despre tabele, coloane, indexuri și chei străine. Puteți utiliza reflecția pentru a genera scheme, a crea aplicații flexibile de baze de date sau a construi instrumente generale de baze de date.

Puteți obține obiectul reflection dintr-o instanță de conexiune la o bază de date:

$reflection = $database->getReflection();

Recuperarea tabelelor

Proprietatea readonly $reflection->tables oferă un array asociativ al tuturor tabelelor din baza de date:

// Listarea numelor tuturor tabelelor
foreach ($reflection->tables as $name => $table) {
	echo $name . "\n";
}

Există două metode suplimentare disponibile:

// Verifică dacă un tabel există
if ($reflection->hasTable('users')) {
	echo "The table 'users' exists.";
}

// Recuperează un obiect tabel; aruncă o excepție dacă acesta nu există
$table = $reflection->getTable('users');

Informații despre masă

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

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

Coloane

Proprietatea columns a unui tabel oferă o matrice asociativă de coloane, în care cheia este numele coloanei, iar valoarea este o instanță a Column cu următoarele proprietăți:

  • $name: string – numele coloanei
  • $table: ?Table – o referință la tabelul coloanei
  • $nativeType: string – tipul 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-incrementată
  • $primary: bool – dacă coloana face parte din cheia primară
  • $vendor: array – metadate suplimentare specifice sistemului de baze de date
foreach ($table->columns as $name => $column) {
	echo "Column: $name\n";
	echo "Type: {$column->nativeType}\n";
	echo "Nullable: " . ($column->nullable ? 'Yes' : 'No') . "\n";
}

Indexuri

Proprietatea indexes a unui tabel conține o serie de indexuri, unde fiecare index este o instanță de Index cu următoarele proprietăți:

  • $columns: Column[] – o matrice de coloane care alcătuiesc indexul
  • $unique: bool – dacă indexul este unic
  • $primary: bool – dacă este o cheie primară
  • $name: ?string – numele indexului

Cheia primară a unui tabel poate fi accesată prin intermediul proprietății primaryKey, care returnează un obiect Index sau null dacă tabelul nu are una.

// Listarea indicilor
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";
}

// Afișarea cheii primare
if ($primaryKey = $table->primaryKey) {
	$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
	echo "Primary Key: $columns\n";
}

Chei străine

Proprietatea foreignKeys a unui tabel conține o serie de chei străine, fiecare reprezentată ca o instanță de ForeignKey cu următoarele proprietăți:

  • $foreignTable: Table – tabelul la care se face referire
  • $localColumns: Column[] – o serie de coloane locale
  • $foreignColumns: Column[] – o serie de coloane de referință
  • $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