Reflexe
Η Nette Database παρέχει εργαλεία για την ενδοσκόπηση της δομής της βάσης δεδομένων χρησιμοποιώντας την κλάση Nette\Database\Reflection\Reflection. Αυτό σας επιτρέπει να ανακτάτε πληροφορίες σχετικά με πίνακες, στήλες, δείκτες και ξένα κλειδιά. Η αντανάκλαση μπορεί να χρησιμοποιηθεί για τη δημιουργία σχημάτων, τη δημιουργία ευέλικτων εφαρμογών βασισμένων σε βάσεις δεδομένων ή για γενικά εργαλεία βάσεων δεδομένων.
Μπορείτε να λάβετε το αντικείμενο της αντανάκλασης από μια περίπτωση σύνδεσης με τη βάση δεδομένων:
$reflection = $connection->getReflection();
Εργασία με πίνακες
Χρησιμοποιώντας την αντανάκλαση μπορούμε να περιηγηθούμε σε όλους τους πίνακες της βάσης δεδομένων:
getTables(): Nette\Database\Reflection\Table[]
Επιστρέφει έναν συσχετιστικό πίνακα όπου το κλειδί είναι το όνομα του πίνακα και η τιμή είναι ένας πίνακας μεταδεδομένων του πίνακα.
// Λίστα με όλα τα ονόματα πινάκων
foreach ($reflection->getTables() as $table) {
echo $table['name'] . "\n";
}
hasTable (string $name): bool
Επιστρέφει true
εάν ο πίνακας υπάρχει, διαφορετικά false
.
// Έλεγχος ύπαρξης πίνακα
if ($reflection->hasTable('users')) {
echo "The 'users' table exists";
}
getTable (string $name): Nette\Database\Reflection\Table
Επιστρέφει το αντικείμενο Nette\Database\Reflection\Table
που
αντιπροσωπεύει τον συγκεκριμένο πίνακα. Εάν ο πίνακας δεν υπάρχει,
πετάει μια εξαίρεση Nette\Database\Exception\MissingTableException
.
// Ανάκτηση ενός συγκεκριμένου πίνακα
$table = $reflection->getTable('users');
Πληροφορίες για τις στήλες
Το αντικείμενο Nette\Database\Reflection\Table, το
οποίο λαμβάνεται με την κλήση του getTable()
, σας επιτρέπει να
ανακτήσετε λεπτομερείς πληροφορίες σχετικά με τις στήλες του
πίνακα.
getColumns(): Nette\Database\Reflection\Column[]
Επιστρέφει έναν πίνακα αντικειμένων Nette\Database\Reflection\Column
που
αναπαριστούν τις στήλες του πίνακα.
getColumn (string $name): Nette\Database\Reflection\Column
Επιστρέφει το αντικείμενο Nette\Database\Reflection\Column που
αντιπροσωπεύει τη δεδομένη στήλη. Εάν η στήλη δεν υπάρχει, πετάει μια
εξαίρεση Nette\Database\Exception\MissingColumnException
.
Το αντικείμενο Column
παρέχει τις ακόλουθες ιδιότητες:
name
: Το όνομα της στήλης.nativeType
: Ο συγκεκριμένος τύπος δεδομένων της στήλης για τη βάση δεδομένων.type
: Ο κανονικοποιημένος τύπος δεδομένων της στήλης (βλέπε σταθερέςNette\Utils\Type
).nullable
:true
εάν η στήλη μπορεί να περιέχειNULL
, διαφορετικάfalse
.primary
:true
αν η στήλη είναι μέρος του πρωτεύοντος κλειδιού, διαφορετικάfalse
.autoIncrement
:true
αν η στήλη είναι αυτόματης αύξησης, διαφορετικάfalse
.default
: Η προεπιλεγμένη τιμή της στήλης, ήnull
εάν δεν έχει οριστεί.vendor
: Ένας πίνακας με πρόσθετες πληροφορίες σχετικά με τη βάση δεδομένων.
// Επανάληψη όλων των στηλών του πίνακα '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";
}
// Ανάκτηση μιας συγκεκριμένης στήλης
$idColumn = $table->getColumn('id');
Δείκτες και πρωτεύοντα κλειδιά
getIndexes(): Nette\Database\Reflection\Index[]
Επιστρέφει έναν πίνακα αντικειμένων Nette\Database\Reflection\Index
που
αντιπροσωπεύουν τους δείκτες του πίνακα.
getIndex (string $name): Nette\Database\Reflection\Index
Επιστρέφει το αντικείμενο Nette\Database\Reflection\Index που
αντιπροσωπεύει το δεδομένο δείκτη. Εάν το ευρετήριο δεν υπάρχει,
πετάει μια εξαίρεση Nette\Database\Exception\MissingIndexException
.
getPrimaryKey(): ?Nette\Database\Reflection\Index
Επιστρέφει το αντικείμενο Nette\Database\Reflection\Index
που
αντιπροσωπεύει το πρωτεύον κλειδί του πίνακα ή το null
εάν ο
πίνακας δεν έχει πρωτεύον κλειδί.
Το αντικείμενο Index
παρέχει τις ακόλουθες ιδιότητες:
name
: Το όνομα του δείκτη.columns
: Ένας πίνακας αντικειμένωνNette\Database\Reflection\Column
που αναπαριστούν τις στήλες που αποτελούν μέρος του ευρετηρίου.unique
:true
εάν το ευρετήριο είναι μοναδικό, διαφορετικάfalse
.primary
:true
αν το ευρετήριο είναι το πρωτεύον κλειδί, διαφορετικάfalse
.
$table = $reflection->getTable('users');
$printColumnNames = fn(array $columns) => implode(', ', array_map(fn($col) => $col->name, $columns));
// Λίστα όλων των ευρετηρίων
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";
}
// Ανάκτηση του πρωτεύοντος κλειδιού
if ($primaryKey = $table->getPrimaryKey()) {
echo "Primary key: " . $printColumnNames($primaryKey->columns) . "\n";
}
Ξένα κλειδιά
getForeignKeys(): Nette\Database\Reflection\ForeignKey[]
Επιστρέφει έναν πίνακα αντικειμένων Nette\Database\Reflection\ForeignKey
που
αντιπροσωπεύουν τα ξένα κλειδιά του πίνακα.
getForeignKey (string $name): Nette\Database\Reflection\ForeignKey
Επιστρέφει το αντικείμενο Nette\Database\Reflection\ForeignKey
που αντιπροσωπεύει το συγκεκριμένο ξένο κλειδί. Εάν το ξένο κλειδί δεν
υπάρχει, πετάει μια εξαίρεση Nette\Database\Exception\MissingForeignKeyException
.
Το αντικείμενο ForeignKey
παρέχει τις ακόλουθες ιδιότητες:
name
: Το όνομα του ξένου κλειδιού.localColumns
: Ένας πίνακας αντικειμένωνNette\Database\Reflection\Column
που αντιπροσωπεύουν τις τοπικές στήλες που αποτελούν το ξένο κλειδί.foreignTable
: Ένα αντικείμενοNette\Database\Reflection\Table
που αναπαριστά τον ξένο πίνακα στον οποίο αναφέρεται το ξένο κλειδί.foreignColumns
: Ένας πίνακας αντικειμένωνNette\Database\Reflection\Column
που αναπαριστούν τις ξένες στήλες στις οποίες αναφέρεται το ξένο κλειδί.
$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";
}