Nette Database

Nette Database è un layer di database potente ed elegante per PHP, con un'enfasi sulla semplicità e sulle funzionalità intelligenti. Offre due modi per lavorare con il database: Explorer per lo sviluppo rapido di applicazioni, o l'accesso SQL per lavorare direttamente con le query.

Accesso SQL

  • Query parametrizzate sicure
  • Controllo preciso sulla forma delle query SQL
  • Quando si scrivono query complesse con funzionalità avanzate
  • Ottimizzazione delle performance utilizzando funzioni SQL specifiche

Explorer

  • Sviluppo rapido senza scrivere SQL
  • Lavoro intuitivo con le relazioni tra tabelle
  • Apprezzerete l'ottimizzazione automatica delle query
  • Adatto per un lavoro rapido e comodo con il database

Installazione

Scarica e installa la libreria utilizzando lo strumento Composer:

composer require nette/database

Database supportati

Nette Database supporta i seguenti database:

Server Database Nome DSN Supporto in 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

Due approcci al database

Nette Database ti dà una scelta: puoi scrivere direttamente le query SQL (accesso SQL) o lasciarle generare automaticamente (Explorer). Vediamo come entrambi gli approcci risolvono gli stessi compiti:

Accesso SQL – Query SQL

// inserimento di un record
$database->query('INSERT INTO books', [
	'author_id' => $authorId,
	'title' => $bookData->title,
	'published_at' => new DateTime,
]);

// recupero dei record: autori dei libri
$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
');

// output (non ottimale, genera N query aggiuntive)
foreach ($result as $author) {
	$books = $database->query('
		SELECT * FROM books
		WHERE author_id = ?
		ORDER BY published_at DESC
	', $author->id);

	echo "Autore $author->name ha scritto $author->books_count libri:\n";

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

Approccio Explorer – generazione automatica di SQL

// inserimento di un record
$database->table('books')->insert([
	'author_id' => $authorId,
	'title' => $bookData->title,
	'published_at' => new DateTime,
]);

// recupero dei record: autori dei libri
$authors = $database->table('authors')
	->where('active', 1);

// output (genera automaticamente solo 2 query ottimizzate)
foreach ($authors as $author) {
	$books = $author->related('books')
		->order('published_at DESC');

	echo "Autore $author->name ha scritto {$books->count()} libri:\n";

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

L'approccio Explorer genera e ottimizza automaticamente le query SQL. Nell'esempio fornito, l'accesso SQL genera N+1 query (una per gli autori e poi una per i libri di ciascun autore), mentre Explorer ottimizza automaticamente le query ed ne esegue solo due: una per gli autori e una per tutti i loro libri.

Entrambi gli approcci possono essere combinati liberamente nell'applicazione secondo necessità.

Connessione e configurazione

Per connettersi al database, è sufficiente creare un'istanza della classe Nette\Database\Connection:

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

Il parametro $dsn (data source name) è lo stesso quello utilizzato da PDO, ad esempio host=127.0.0.1;dbname=test. In caso di fallimento, lancia un'eccezione Nette\Database\ConnectionException.

Tuttavia, un modo più pratico è offerto dalla configurazione dell'applicazione, dove è sufficiente aggiungere la sezione database e verranno creati gli oggetti necessari e anche il pannello del database nella barra di Tracy.

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

Successivamente, otteniamo come servizio dal container DI l'oggetto della connessione, ad esempio:

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

Maggiori informazioni sulla configurazione del database.

Creazione manuale di Explorer

Se non si utilizza il container Nette DI, è possibile creare manualmente un'istanza di Nette\Database\Explorer:

// connessione al database
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// storage per la cache, implementa Nette\Caching\Storage, ad esempio:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// si occupa della riflessione della struttura del database
$structure = new Nette\Database\Structure($connection, $storage);
// definisce le regole per la mappatura dei nomi di tabelle, colonne e chiavi esterne
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);

Gestione della connessione

Quando viene creato un oggetto Connection, la connessione viene stabilita automaticamente. Se si desidera posticipare la connessione, utilizzare la modalità lazy – questa può essere abilitata nella configurazione impostando lazy su true, o in questo modo:

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

Per gestire la connessione, utilizzare i metodi connect(), disconnect() e reconnect().

  • connect() crea una connessione se non esiste già, e può lanciare un'eccezione Nette\Database\ConnectionException.
  • disconnect() disconnette la connessione corrente al database.
  • reconnect() esegue la disconnessione e la successiva riconnessione al database. Questo metodo può anche lanciare un'eccezione Nette\Database\ConnectionException.

Inoltre, è possibile monitorare gli eventi associati alla connessione utilizzando l'evento onConnect, che è un array di callback che vengono chiamati dopo aver stabilito una connessione al database.

// viene eseguito dopo la connessione al database
$database->onConnect[] = function($database) {
	echo "Connesso al database";
};

Tracy Debug Bar

Se utilizzi Tracy, il pannello Database viene attivato automaticamente nella Debug Bar, mostrando tutte le query eseguite, i loro parametri, il tempo di esecuzione e la posizione nel codice in cui sono state chiamate.

versione: 4.0