Nette Database

Nette Database este un strat de baze de date puternic și elegant pentru PHP, cu accent pe simplitate și funcții inteligente. Oferă două moduri de a lucra cu baza de date – Explorer pentru dezvoltarea rapidă a aplicațiilor sau abordarea SQL pentru lucrul direct cu interogări.

Abordarea SQL

  • Interogări parametrizate sigure
  • Control precis asupra formei interogărilor SQL
  • Când scrieți interogări complexe cu funcții avansate
  • Optimizați performanța folosind funcții SQL specifice

Explorer

  • Dezvoltați rapid fără a scrie SQL
  • Lucru intuitiv cu relațiile dintre tabele
  • Apreciați optimizarea automată a interogărilor
  • Potrivit pentru lucrul rapid și confortabil cu baza de date

Instalare

Descărcați și instalați biblioteca folosind Composer:

composer require nette/database

Baze de date suportate

Nette Database suportă următoarele baze de date:

Server de baze de date Nume DSN Suport în Explorer
MySQL (>= 5.1) mysql DA
PostgreSQL (>= 9.0) pgsql DA
Sqlite 3 (>= 3.8) sqlite DA
Oracle oci
MS SQL (PDO_SQLSRV) sqlsrv DA
MS SQL (PDO_DBLIB) mssql
ODBC odbc

Două abordări ale bazei de date

Nette Database vă oferă o alegere: puteți fie să scrieți interogări SQL direct (abordarea SQL), fie să le lăsați generate automat (Explorer). Să vedem cum ambele abordări rezolvă aceleași sarcini:

Abordarea SQL – Interogări SQL

// inserarea unei înregistrări
$database->query('INSERT INTO books', [
	'author_id' => $authorId,
	'title' => $bookData->title,
	'published_at' => new DateTime,
]);

// obținerea înregistrărilor: autorii cărților
$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
');

// listare (nu este optimă, generează N interogări suplimentare)
foreach ($result as $author) {
	$books = $database->query('
		SELECT * FROM books
		WHERE author_id = ?
		ORDER BY published_at DESC
	', $author->id);

	echo "Autorul $author->name a scris $author->books_count cărți:\n";

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

Abordarea Explorer – generare automată SQL

// inserarea unei înregistrări
$database->table('books')->insert([
	'author_id' => $authorId,
	'title' => $bookData->title,
	'published_at' => new DateTime,
]);

// obținerea înregistrărilor: autorii cărților
$authors = $database->table('authors')
	->where('active', 1);

// listare (generează automat doar 2 interogări optimizate)
foreach ($authors as $author) {
	$books = $author->related('books')
		->order('published_at DESC');

	echo "Autorul $author->name a scris {$books->count()} cărți:\n";

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

Abordarea Explorer generează și optimizează interogările SQL automat. În exemplul dat, abordarea SQL generează N+1 interogări (una pentru autori și apoi una pentru cărțile fiecărui autor), în timp ce Explorer optimizează automat interogările și execută doar două – una pentru autori și una pentru toate cărțile lor.

Ambele abordări pot fi combinate liber în aplicație după cum este necesar.

Conectare și configurare

Pentru a vă conecta la baza de date, trebuie doar să creați o instanță a clasei Nette\Database\Connection:

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

Parametrul $dsn (data source name) este același ca cel utilizat de PDO, de ex. mysql:host=127.0.0.1;dbname=test. În caz de eșec, aruncă o excepție Nette\Database\ConnectionException.

Cu toate acestea, o modalitate mai convenabilă este oferită de configurația aplicației, unde trebuie doar să adăugați secțiunea database și se vor crea obiectele necesare, precum și panoul bazei de date în bara Tracy.

database:
	dsn: 'mysql:host=127.0.0.1;dbname=test'
	user: root
	password: password

Apoi, obținem obiectul conexiunii ca serviciu din containerul DI, de exemplu:

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

Mai multe informații despre configurarea bazei de date.

Crearea manuală a Explorer

Dacă nu utilizați containerul Nette DI, puteți crea manual o instanță Nette\Database\Explorer:

// conectare la baza de date
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// stocare pentru cache, implementează Nette\Caching\Storage, de ex.:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// se ocupă de reflexia structurii bazei de date
$structure = new Nette\Database\Structure($connection, $storage);
// definește reguli pentru maparea numelor de tabele, coloane și chei străine
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);

Gestionarea conexiunii

La crearea obiectului Connection, conexiunea se stabilește automat. Dacă doriți să amânați conexiunea, utilizați modul lazy – îl activați în configurație setând lazy: true, sau astfel:

$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);

Pentru gestionarea conexiunii, utilizați metodele connect(), disconnect() și reconnect().

  • connect() creează conexiunea dacă nu există deja, putând arunca o excepție Nette\Database\ConnectionException.
  • disconnect() deconectează conexiunea curentă la baza de date.
  • reconnect() efectuează deconectarea și apoi reconectarea la baza de date. Această metodă poate arunca, de asemenea, o excepție Nette\Database\ConnectionException.

În plus, puteți monitoriza evenimentele legate de conexiune folosind evenimentul onConnect, care este un array de callback-uri care sunt apelate după stabilirea conexiunii cu baza de date.

// se execută după conectarea la baza de date
$database->onConnect[] = function($database) {
	echo "Conectat la baza de date";
};

Bara de depanare Tracy

Dacă utilizați Tracy, panoul Database se activează automat în bara de depanare, afișând toate interogările executate, parametrii lor, timpul de execuție și locul din cod unde au fost apelate.

versiune: 4.0