Αντανάκλαση Δομής
Το Nette Database παρέχει εργαλεία για την ενδοσκόπηση (introspection) της δομής της βάσης δεδομένων χρησιμοποιώντας την κλάση Nette\Database\Structure. Αυτή επιτρέπει τη λήψη πληροφοριών σχετικά με πίνακες, στήλες, ευρετήρια (indexes) και ξένα κλειδιά (foreign keys). Μπορείτε να χρησιμοποιήσετε την αντανάκλαση (reflection) για τη δημιουργία σχημάτων (schemas), τη δημιουργία ευέλικτων εφαρμογών που λειτουργούν με τη βάση δεδομένων ή γενικών εργαλείων βάσης δεδομένων.
Λαμβάνουμε το αντικείμενο αντανάκλασης από την παρουσία της σύνδεσης με τη βάση δεδομένων:
$reflection = $database->getReflection();
Λήψη Πινάκων
Η ιδιότητα readonly $reflection->tables
περιέχει έναν συσχετιστικό
πίνακα όλων των πινάκων στη βάση δεδομένων:
// Εμφάνιση ονομάτων όλων των πινάκων
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Υπάρχουν δύο ακόμη διαθέσιμες μέθοδοι:
// Έλεγχος ύπαρξης πίνακα
if ($reflection->hasTable('users')) {
echo "Ο πίνακας users υπάρχει"; // Table users exists
}
// Επιστρέφει το αντικείμενο του πίνακα. αν δεν υπάρχει, προκαλεί εξαίρεση
$table = $reflection->getTable('users');
Πληροφορίες για τον Πίνακα
Ο πίνακας αντιπροσωπεύεται από το αντικείμενο Table, το οποίο παρέχει τις ακόλουθες ιδιότητες readonly:
$name: string
– όνομα του πίνακα$view: bool
– εάν πρόκειται για προβολή (view)$fullName: ?string
– πλήρες όνομα του πίνακα συμπεριλαμβανομένου του σχήματος (εάν υπάρχει)$columns: array<string, Column>
– συσχετιστικός πίνακας στηλών του πίνακα$indexes: Index[]
– πίνακας ευρετηρίων του πίνακα$primaryKey: ?Index
– πρωτεύον κλειδί του πίνακα ή null$foreignKeys: ForeignKey[]
– πίνακας ξένων κλειδιών του πίνακα
Στήλες
Η ιδιότητα columns
του πίνακα παρέχει έναν συσχετιστικό πίνακα
στηλών, όπου το κλειδί είναι το όνομα της στήλης και η τιμή είναι μια
παρουσία Column με τις
ακόλουθες ιδιότητες:
$name: string
– όνομα της στήλης$table: ?Table
– αναφορά στον πίνακα της στήλης$nativeType: string
– εγγενής τύπος δεδομένων της βάσης δεδομένων$size: ?int
– μέγεθος/μήκος του τύπου$nullable: bool
– εάν η στήλη μπορεί να περιέχει NULL$default: mixed
– προεπιλεγμένη τιμή της στήλης$autoIncrement: bool
– εάν η στήλη είναι auto-increment$primary: bool
– εάν αποτελεί μέρος του πρωτεύοντος κλειδιού$vendor: array
– πρόσθετα μεταδεδομένα ειδικά για το συγκεκριμένο σύστημα βάσης δεδομένων
foreach ($table->columns as $name => $column) {
echo "Στήλη: $name\n"; // Column:
echo "Τύπος: {$column->nativeType}\n"; // Type:
echo "Nullable: " . ($column->nullable ? 'Ναι' : 'Όχι') . "\n"; // Nullable: Yes / No
}
Ευρετήρια
Η ιδιότητα indexes
του πίνακα παρέχει έναν πίνακα ευρετηρίων,
όπου κάθε ευρετήριο είναι μια παρουσία Index με τις ακόλουθες
ιδιότητες:
$columns: Column[]
– πίνακας στηλών που αποτελούν το ευρετήριο$unique: bool
– εάν το ευρετήριο είναι μοναδικό$primary: bool
– εάν πρόκειται για πρωτεύον κλειδί$name: ?string
– όνομα του ευρετηρίου
Το πρωτεύον κλειδί του πίνακα μπορεί να ληφθεί χρησιμοποιώντας την
ιδιότητα primaryKey
, η οποία επιστρέφει είτε ένα αντικείμενο
Index
, είτε null
στην περίπτωση που ο πίνακας δεν έχει
πρωτεύον κλειδί.
// Εμφάνιση ευρετηρίων
foreach ($table->indexes as $index) {
$columns = implode(', ', array_map(fn($col) => $col->name, $index->columns));
echo "Ευρετήριο" . ($index->name ? " {$index->name}" : '') . ":\n"; // Index
echo " Στήλες: $columns\n"; // Columns:
echo " Μοναδικό: " . ($index->unique ? 'Ναι' : 'Όχι') . "\n"; // Unique: Yes / No
}
// Εμφάνιση πρωτεύοντος κλειδιού
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Πρωτεύον κλειδί: $columns\n"; // Primary key:
}
Ξένα κλειδιά
Η ιδιότητα foreignKeys
του πίνακα παρέχει έναν πίνακα ξένων
κλειδιών, όπου κάθε ξένο κλειδί είναι μια παρουσία ForeignKey με τις
ακόλουθες ιδιότητες:
$foreignTable: Table
– ο πίνακας στον οποίο γίνεται αναφορά$localColumns: Column[]
– πίνακας τοπικών στηλών$foreignColumns: Column[]
– πίνακας στηλών στις οποίες γίνεται αναφορά$name: ?string
– όνομα του ξένου κλειδιού
// Εμφάνιση ξένων κλειδιών
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";
}