Database Nette

Nette Database è un potente ed elegante livello di database per PHP, noto per la sua semplicità e le sue caratteristiche intelligenti. Non richiede una configurazione complessa o la generazione di entità, consentendo di iniziare a lavorare immediatamente.

Con Nette Database è possibile lavorare in due modi:

SQL diretto

  • Query sicure e parametrizzate
  • Controllo preciso sulla struttura delle query SQL
  • Ideale per scrivere query complesse con funzioni avanzate
  • Ottimizzazione delle prestazioni grazie a funzioni SQL specifiche

Esploratore

  • Sviluppo veloce senza scrivere SQL
  • Gestione intuitiva delle relazioni tra tabelle
  • Ottimizzazione automatica delle query
  • Ottimo per interazioni rapide e convenienti con il database

Installazione

È possibile scaricare e installare la libreria utilizzando Composer:

composer require nette/database

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 (nome dell'origine dati) segue lo stesso formato utilizzato da PDO, ad esempio host=127.0.0.1;dbname=test. Se la connessione fallisce, viene lanciata l'istanza Nette\Database\ConnectionException.

Tuttavia, un metodo più comodo è quello di utilizzare la configurazione dell'applicazione. Aggiungendo una sezione database, verranno creati gli oggetti necessari, compreso un pannello del database nella barra di debug di Tracy.

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

Dopodiché, l'oggetto connessione può essere recuperato come servizio dal contenitore DI, ad esempio:

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

Per ulteriori informazioni, vedere Configurazione del database.

Due approcci al lavoro sui database

Con Nette Database, è possibile scrivere direttamente le query SQL (approccio diretto) o lasciare che l'SQL venga generato automaticamente (approccio Explorer). Vediamo come entrambi gli approcci risolvono gli stessi compiti:

Approccio diretto – Scrittura di query SQL

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

// Recuperare i record: autori di 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
');

// Visualizzazione (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 "Author $author->name has written $author->books_count books:\n";

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

Approccio Explorer – Generazione automatica di SQL

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

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

// Visualizzazione (genera automaticamente solo 2 query ottimizzate)
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";
	}
}

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

È possibile combinare liberamente entrambi gli approcci nella propria applicazione, a seconda delle necessità.

Gestione delle connessioni

Quando si crea un oggetto Connection, questo si connette automaticamente al database. Se si vuole ritardare la connessione, attivare la modalità pigra nella configurazione, impostando lazy, oppure procedere 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() stabilisce una connessione se non è già stata stabilita e può lanciare un Nette\Database\ConnectionException.
  • disconnect() si disconnette dal database.
  • reconnect() si disconnette e poi si riconnette al database e può anche lanciare un Nette\Database\ConnectionException.

Inoltre, è possibile monitorare gli eventi di connessione utilizzando l'evento onConnect, che è un array di callback eseguiti dopo la connessione al database.

// Richiamato dopo la connessione al database
$database->onConnect[] = function($database) {
	echo "Connected to the database";
};

Barra di Debug Tracy

Se si utilizza Tracy, il pannello Database della barra di debug viene automaticamente attivato. Esso visualizza tutte le query eseguite, i loro parametri, il tempo di esecuzione e la posizione nel codice in cui sono state chiamate.

Database supportati

Nette Database supporta i seguenti database:

Database Server DSN Name Explorer Support
MySQL (>= 5.1) mysql SI
PostgreSQL (>= 9.0) pgsql
SQLite 3 (>= 3.8) sqlite
Oracle oci NO
MS SQL (PDO_SQLSRV) sqlsrv SI'
MS SQL (PDO_DBLIB) mssql NO
ODBC odbc NO
versione: 4.0