Nette Database
Το Nette Database είναι ένα ισχυρό και κομψό επίπεδο βάσης δεδομένων για PHP με έμφαση στην απλότητα και τις έξυπνες λειτουργίες. Προσφέρει δύο τρόπους εργασίας με τη βάση δεδομένων – Explorer για γρήγορη ανάπτυξη εφαρμογών, ή πρόσβαση SQL για άμεση εργασία με ερωτήματα.
Πρόσβαση SQL
- Ασφαλή παραμετροποιημένα ερωτήματα
- Ακριβής έλεγχος της μορφής των ερωτημάτων SQL
- Όταν γράφετε σύνθετα ερωτήματα με προηγμένες λειτουργίες
- Βελτιστοποιείτε την απόδοση χρησιμοποιώντας συγκεκριμένες λειτουργίες SQL
Explorer
- Αναπτύσσετε γρήγορα χωρίς να γράφετε SQL
- Διαισθητική εργασία με σχέσεις μεταξύ πινάκων
- Εκτιμάτε την αυτόματη βελτιστοποίηση ερωτημάτων
- Κατάλληλο για γρήγορη και άνετη εργασία με τη βάση δεδομένων
Εγκατάσταση
Κατεβάστε και εγκαταστήστε τη βιβλιοθήκη χρησιμοποιώντας το εργαλείο Composer:
composer require nette/database
Υποστηριζόμενες Βάσεις Δεδομένων
Το Nette Database υποστηρίζει τις ακόλουθες βάσεις δεδομένων:
Διακομιστής Βάσης Δεδομένων | Όνομα DSN | Υποστήριξη στον Explorer |
---|---|---|
MySQL (>= 5.1) | mysql | ΝΑΙ |
PostgreSQL (>= 9.0) | pgsql | ΝΑΙ |
Sqlite 3 (>= 3.8) | sqlite | ΝΑΙ |
Oracle | oci | – |
MS SQL (PDO_SQLSRV) | sqlsrv | ΝΑΙ |
MS SQL (PDO_DBLIB) | mssql | – |
ODBC | odbc | – |
Δύο Προσεγγίσεις στη Βάση Δεδομένων
Το Nette Database σας δίνει μια επιλογή: μπορείτε είτε να γράψετε απευθείας ερωτήματα SQL (πρόσβαση SQL), είτε να τα αφήσετε να δημιουργηθούν αυτόματα (Explorer). Ας δούμε πώς και οι δύο προσεγγίσεις επιλύουν τις ίδιες εργασίες:
Πρόσβαση SQL – Ερωτήματα SQL
// εισαγωγή εγγραφής
$database->query('INSERT INTO books', [
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// λήψη εγγραφών: συγγραφείς βιβλίων
$result = $database->query('
SELECT authors.*, COUNT(books.id) AS books_count
FROM authors
LEFT JOIN books ON authors.id = books.author_id
WHERE authors.active = 1
GROUP BY authors.id
');
// έξοδος (δεν είναι βέλτιστη, δημιουργεί N+1 ερωτήματα)
foreach ($result as $author) {
$books = $database->query('
SELECT * FROM books
WHERE author_id = ?
ORDER BY published_at DESC
', $author->id);
echo "Ο συγγραφέας $author->name έγραψε $author->books_count βιβλία:\n"; // Author $author->name wrote $author->books_count books:\n
foreach ($books as $book) {
echo "- $book->title\n";
}
}
Πρόσβαση Explorer – Αυτόματη δημιουργία SQL
// εισαγωγή εγγραφής
$database->table('books')->insert([
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// λήψη εγγραφών: συγγραφείς βιβλίων
$authors = $database->table('authors')
->where('active', 1);
// έξοδος (δημιουργεί αυτόματα μόνο 2 βελτιστοποιημένα ερωτήματα)
foreach ($authors as $author) {
$books = $author->related('books')
->order('published_at DESC');
echo "Ο συγγραφέας $author->name έγραψε {$books->count()} βιβλία:\n"; // Author $author->name wrote {$books->count()} books:\n
foreach ($books as $book) {
echo "- $book->title\n";
}
}
Η προσέγγιση Explorer δημιουργεί και βελτιστοποιεί αυτόματα τα ερωτήματα SQL. Στο παραπάνω παράδειγμα, η πρόσβαση SQL δημιουργεί N+1 ερωτήματα (ένα για τους συγγραφείς και στη συνέχεια ένα για τα βιβλία κάθε συγγραφέα), ενώ ο Explorer βελτιστοποιεί αυτόματα τα ερωτήματα και εκτελεί μόνο δύο – ένα για τους συγγραφείς και ένα για όλα τα βιβλία τους.
Και οι δύο προσεγγίσεις μπορούν να συνδυαστούν ελεύθερα στην εφαρμογή ανάλογα με τις ανάγκες.
Σύνδεση και Διαμόρφωση
Για να συνδεθείτε στη βάση δεδομένων, απλώς δημιουργήστε μια παρουσία της κλάσης Nette\Database\Connection:
$database = new Nette\Database\Connection($dsn, $user, $password);
Η παράμετρος $dsn
(data source name) είναι η ίδια που χρησιμοποιεί το
PDO, π.χ. mysql:host=127.0.0.1;dbname=test
. Σε περίπτωση αποτυχίας, θα
προκαλέσει μια εξαίρεση Nette\Database\ConnectionException
.
Ωστόσο, ένας πιο βολικός τρόπος προσφέρεται από τη διαμόρφωση εφαρμογής, όπου απλά
προσθέτετε την ενότητα database
και δημιουργούνται τα απαραίτητα
αντικείμενα καθώς και ο πίνακας της βάσης δεδομένων στη γραμμή Tracy.
database:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: password
Στη συνέχεια, λαμβάνουμε το αντικείμενο σύνδεσης ως υπηρεσία από το DI container, π.χ.:
class Model
{
public function __construct(
// ή Nette\Database\Explorer
private Nette\Database\Connection $database,
) {
}
}
Περισσότερες πληροφορίες σχετικά με τη διαμόρφωση της βάσης δεδομένων.
Χειροκίνητη Δημιουργία του Explorer
Εάν δεν χρησιμοποιείτε το Nette DI container, μπορείτε να δημιουργήσετε
χειροκίνητα την παρουσία Nette\Database\Explorer
:
// σύνδεση στη βάση δεδομένων
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// αποθήκη για την cache, υλοποιεί το Nette\Caching\Storage, π.χ.:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// φροντίζει για την αντανάκλαση της δομής της βάσης δεδομένων
$structure = new Nette\Database\Structure($connection, $storage);
// ορίζει κανόνες για την αντιστοίχιση ονομάτων πινάκων, στηλών και ξένων κλειδιών
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);
Διαχείριση Σύνδεσης
Κατά τη δημιουργία του αντικειμένου Connection
, η σύνδεση
πραγματοποιείται αυτόματα. Εάν θέλετε να καθυστερήσετε τη σύνδεση,
χρησιμοποιήστε τη λειτουργία lazy – την ενεργοποιείτε στη διαμόρφωση ορίζοντας το lazy: true
,
ή ως εξής:
$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);
Για τη διαχείριση της σύνδεσης, χρησιμοποιήστε τις μεθόδους
connect()
, disconnect()
και reconnect()
.
connect()
: δημιουργεί τη σύνδεση, εάν δεν υπάρχει ήδη. Μπορεί να προκαλέσει εξαίρεσηNette\Database\ConnectionException
.disconnect()
: αποσυνδέει την τρέχουσα σύνδεση με τη βάση δεδομένων.reconnect()
: πραγματοποιεί αποσύνδεση και στη συνέχεια επανασύνδεση με τη βάση δεδομένων. Αυτή η μέθοδος μπορεί επίσης να προκαλέσει εξαίρεσηNette\Database\ConnectionException
.
Επιπλέον, μπορείτε να παρακολουθείτε τα συμβάντα που σχετίζονται με
τη σύνδεση χρησιμοποιώντας το συμβάν onConnect
, το οποίο είναι ένας
πίνακας callbacks που καλούνται μετά την εγκατάσταση της σύνδεσης με τη
βάση δεδομένων.
// εκτελείται μετά τη σύνδεση στη βάση δεδομένων
$database->onConnect[] = function($database) {
echo "Συνδεθήκατε στη βάση δεδομένων"; // Connected to the database
};
Tracy Debug Bar
Εάν χρησιμοποιείτε το Tracy, ενεργοποιείται αυτόματα ο πίνακας Database στη γραμμή Debug, ο οποίος εμφανίζει όλα τα εκτελεσμένα ερωτήματα, τις παραμέτρους τους, τον χρόνο εκτέλεσης και το σημείο στον κώδικα όπου κλήθηκαν.
