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

έκδοση: 4.0