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țieNette\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țieNette\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.
