Αντανάκλαση της δομής
Η Nette Database παρέχει εργαλεία για την επιθεώρηση των δομών της βάσης δεδομένων μέσω της κλάσης Nette\Database\Reflection. Αυτό σας επιτρέπει να ανακτάτε πληροφορίες σχετικά με πίνακες, στήλες, δείκτες και ξένα κλειδιά. Μπορείτε να χρησιμοποιήσετε την αντανάκλαση για να δημιουργήσετε σχήματα, να δημιουργήσετε ευέλικτες εφαρμογές βάσεων δεδομένων ή να δημιουργήσετε γενικά εργαλεία βάσεων δεδομένων.
Μπορείτε να λάβετε το αντικείμενο reflection από μια περίπτωση σύνδεσης με τη βάση δεδομένων:
$reflection = $database->getReflection();
Ανάκτηση πινάκων
Η ιδιότητα μόνο για ανάγνωση $reflection->tables
παρέχει έναν
συσχετιστικό πίνακα όλων των πινάκων της βάσης δεδομένων:
// Λίστα με τα ονόματα όλων των πινάκων
foreach ($reflection->tables as $name => $table) {
echo $name . "\n";
}
Υπάρχουν δύο επιπλέον διαθέσιμες μέθοδοι:
// Έλεγχος αν υπάρχει πίνακας
if ($reflection->hasTable('users')) {
echo "The table 'users' exists.";
}
// Ανάκτηση ενός αντικειμένου πίνακα- πετάει μια εξαίρεση αν δεν υπάρχει
$table = $reflection->getTable('users');
Πληροφορίες πίνακα
Ένας πίνακας αναπαρίσταται από το αντικείμενο Table, το οποίο παρέχει τις ακόλουθες ιδιότητες μόνο για ανάγνωση:
$name: string
– το όνομα του πίνακα$view: bool
– αν πρόκειται για προβολή$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
– αν η στήλη αυξάνεται αυτόματα$primary: bool
– εάν η στήλη αποτελεί μέρος του πρωτεύοντος κλειδιού$vendor: array
– πρόσθετα μεταδεδομένα ειδικά για το σύστημα βάσης δεδομένων
foreach ($table->columns as $name => $column) {
echo "Column: $name\n";
echo "Type: {$column->nativeType}\n";
echo "Nullable: " . ($column->nullable ? 'Yes' : 'No') . "\n";
}
Δείκτες
Η ιδιότητα 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" . ($index->name ? " {$index->name}": '') . ":\n";
echo " Columns: $columns\n";
echo " Unique: " . ($index->unique ? 'Yes': 'No') . "\n";
}
// Εμφάνιση του πρωτεύοντος κλειδιού
if ($primaryKey = $table->primaryKey) {
$columns = implode(', ', array_map(fn($col) => $col->name, $primaryKey->columns));
echo "Primary Key: $columns\n";
}
Ξένα κλειδιά
Η ιδιότητα 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";
}