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 | SÌ |
PostgreSQL (>= 9.0) | pgsql | SÌ |
Sqlite 3 (>= 3.8) | sqlite | SÌ |
Oracle | oci | – |
MS SQL (PDO_SQLSRV) | sqlsrv | SÌ |
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'eccezioneNette\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'eccezioneNette\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.
