Βάση δεδομένων Nette

Η Nette Database είναι ένα ισχυρό και κομψό επίπεδο βάσης δεδομένων για την PHP, γνωστό για την απλότητα και τα έξυπνα χαρακτηριστικά του. Δεν απαιτεί πολύπλοκη διαμόρφωση ή δημιουργία οντοτήτων, επιτρέποντάς σας να αρχίσετε να εργάζεστε μαζί του αμέσως.

Με τη Nette Database, μπορείτε να εργαστείτε με δύο τρόπους:

Άμεση SQL

  • Ασφαλή, παραμετροποιημένα ερωτήματα
  • Ακριβής έλεγχος της δομής των ερωτημάτων SQL
  • Ιδανικό για τη συγγραφή σύνθετων ερωτημάτων με προηγμένες συναρτήσεις
  • Βελτιστοποίηση της απόδοσης με τη χρήση συγκεκριμένων συναρτήσεων SQL

Εξερευνητής

  • Γρήγορη ανάπτυξη χωρίς να γράφετε SQL
  • Διαισθητικός χειρισμός των σχέσεων μεταξύ πινάκων
  • Αυτόματη βελτιστοποίηση ερωτημάτων
  • Εξαιρετική για γρήγορες και βολικές αλληλεπιδράσεις με βάσεις δεδομένων

Εγκατάσταση

Μπορείτε να κατεβάσετε και να εγκαταστήσετε τη βιβλιοθήκη χρησιμοποιώντας το Composer:

composer require nette/database

Σύνδεση και διαμόρφωση

Για να συνδεθείτε στη βάση δεδομένων, απλά δημιουργήστε μια περίπτωση της κλάσης Nette\Database\Connection:

$database = new Nette\Database\Connection($dsn, $user, $password);

Η παράμετρος $dsn (Data Source Name) ακολουθεί την ίδια μορφή που χρησιμοποιεί το PDO, π.χ. 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, π.χ:

class Model
{
	public function __construct(
		private Nette\Database\Connection $database,
	) {
	}
}

Για περισσότερες πληροφορίες, ανατρέξτε στην ενότητα Διαμόρφωση βάσης δεδομένων.

Δύο προσεγγίσεις για την εργασία στη βάση δεδομένων

Με τη Nette Database, μπορείτε είτε να γράψετε απευθείας ερωτήματα SQL (Άμεση προσέγγιση) είτε να αφήσετε την SQL να δημιουργηθεί αυτόματα (προσέγγιση Explorer). Ας δούμε πώς και οι δύο προσεγγίσεις επιλύουν τις ίδιες εργασίες:

Άμεση προσέγγιση – Συγγραφή ερωτημάτων 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
');

// Εμφάνιση (όχι βέλτιστη, δημιουργεί Ν πρόσθετα ερωτήματα)
foreach ($result as $author) {
	$books = $database->query('
		SELECT * FROM books
		WHERE author_id = ?
		ORDER BY published_at DESC
	', $author->id);

	echo "Author $author->name has written $author->books_count books:\n";

	foreach ($books as $book) {
		echo "- $book->title\n";
	}
}

Εξερευνητική προσέγγιση – Αυτόματη παραγωγή 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 $author->name has written {$books->count()} books:\n";

	foreach ($books as $book) {
		echo "- $book->title\n";
	}
}

Η προσέγγιση Explorer παράγει και βελτιστοποιεί τα ερωτήματα SQL αυτόματα. Στο παραπάνω παράδειγμα, η προσέγγιση Direct παράγει Ν+1 ερωτήματα (ένα για τους συγγραφείς και ένα για τα βιβλία κάθε συγγραφέα), ενώ η Explorer εκτελεί μόνο δύο βελτιστοποιημένα ερωτήματα – ένα για τους συγγραφείς και ένα για όλα τα βιβλία τους.

Μπορείτε να συνδυάσετε ελεύθερα και τις δύο προσεγγίσεις στην εφαρμογή σας ανάλογα με τις ανάγκες σας.

Διαχείριση συνδέσεων

Όταν δημιουργείτε ένα αντικείμενο Connection, αυτό συνδέεται αυτόματα με τη βάση δεδομένων. Αν θέλετε να καθυστερήσετε τη σύνδεση, ενεργοποιήστε τη λειτουργία lazy mode στη διαμόρφωση ρυθμίζοντας το lazy, ή κάντε το ως εξής:

$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

Εάν χρησιμοποιείτε το Tracy, ο πίνακας Βάση δεδομένων στη γραμμή εντοπισμού σφαλμάτων είναι αυτόματα ενεργοποιημένος. Εμφανίζει όλα τα εκτελεσμένα ερωτήματα, τις παραμέτρους τους, το χρόνο εκτέλεσης και τη θέση στον κώδικα όπου κλήθηκαν.

Υποστηριζόμενες βάσεις δεδομένων

Η Nette Database υποστηρίζει τις ακόλουθες βάσεις δεδομένων:

Διακομιστής βάσης δεδομένων Όνομα DSN Υποστήριξη εξερευνητή
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 NO NO
ODBC odbc NO  
έκδοση: 4.0