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

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

Τρόπος SQL

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

Τρόπος εξερεύνησης

  • Γρήγορη ανάπτυξη χωρίς να γράφετε 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 NO NO
ODBC odbc NO  

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

Με τη βάση δεδομένων Nette, μπορείτε είτε να γράψετε απευθείας ερωτήματα SQL (τρόπος 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
');

// Εμφάνιση (όχι βέλτιστη, δημιουργεί Ν πρόσθετα ερωτήματα)
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";
	}
}

Τρόπος 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 $author->name has written {$books->count()} books:\n";

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

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

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

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

Για να συνδεθείτε στη βάση δεδομένων, απλά δημιουργήστε μια περίπτωση της κλάσης 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(
		// or Nette\Database\Explorer
		private Nette\Database\Connection $database,
	) {
	}
}

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

Χειροκίνητη δημιουργία του Explorer

Εάν δεν χρησιμοποιείτε το δοχείο Nette DI, μπορείτε να δημιουργήσετε χειροκίνητα μια περίπτωση του Nette\Database\Explorer:

// database connection
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// cache storage, implements Nette\Caching\Storage, e.g.:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// handles database structure reflection
$structure = new Nette\Database\Structure($connection, $storage);
// defines rules for mapping table names, columns, and foreign keys
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);

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

Όταν δημιουργείτε ένα αντικείμενο 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, ο πίνακας Βάση δεδομένων στη γραμμή εντοπισμού σφαλμάτων είναι αυτόματα ενεργοποιημένος. Εμφανίζει όλα τα εκτελεσμένα ερωτήματα, τις παραμέτρους τους, το χρόνο εκτέλεσης και τη θέση στον κώδικα όπου κλήθηκαν.

έκδοση: 4.0