Baza de date Nette
Nette Database este un strat de bază de date puternic și elegant pentru PHP, cu accent pe simplitate și caracteristici inteligente. Acesta oferă două moduri complementare de a lucra cu datele dvs. – utilizând Explorer pentru dezvoltare rapidă sau modul SQL pentru control deplin asupra interogărilor.
Calea SQL
- Interogări sigure, parametrizate
- Control precis asupra structurii interogărilor SQL
- Ideal pentru scrierea de interogări complexe cu funcții avansate
- Optimizarea performanței utilizând funcții SQL specifice
Calea exploratorului
- Dezvoltare rapidă fără a scrie SQL
- Gestionarea intuitivă a relațiilor dintre tabele
- Optimizarea automată a interogărilor
- Excelent pentru interacțiuni rapide și convenabile cu baza de date
Instalare
Puteți descărca și instala biblioteca utilizând Composer:
composer require nette/database
Baze de date acceptate
Nette Database suportă următoarele baze de date:
Server de baze de date | Nume DSN | Suport Explorer |
---|---|---|
MySQL (>= 5.1) | mysql | DA |
PostgreSQL (>= 9.0) | pgsql | DA |
SQLite 3 (>= 3.8) | sqlite | DA |
Oracle | oci | NU |
MS SQL (PDO_SQLSRV) | sqlsrv | DA |
MS SQL (PDO_DBLIB) | mssql | NU |
ODBC | odbc | NU |
Două abordări ale lucrului cu baza de date
Cu Nette Database, puteți scrie interogări SQL direct (metoda SQL) sau puteți lăsa ca SQL să fie generat automat (metoda Explorer). Să vedem cum ambele abordări rezolvă aceleași sarcini:
Metoda SQL – Scrierea interogărilor SQL
// Introduceți o înregistrare
$database->query('INSERT INTO books', [
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// Recuperarea înregistrărilor: autori de cărți
$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
');
// Afișare (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 "Author $author->name has written $author->books_count books:\n";
foreach ($books as $book) {
echo "- $book->title\n";
}
}
Explorer way – Generarea automată a SQL
// Introduceți o înregistrare
$database->table('books')->insert([
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// Recuperarea înregistrărilor: autori de cărți
$authors = $database->table('authors')
->where('active', 1);
// Afișare (generează automat doar 2 interogări optimizate)
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";
}
}
Abordarea Explorer generează și optimizează automat interogările SQL. În exemplul de mai sus, exemplul SQL way generează N+1 interogări (una pentru autori și una pentru cărțile fiecărui autor), în timp ce Explorer efectuează doar două interogări optimizate – una pentru autori și alta pentru toate cărțile acestora.
Puteți combina liber ambele abordări în aplicația dvs. în funcție de necesități.
Conectare și configurare
Pentru a vă conecta la baza de date, creați pur și simplu o instanță a clasei Nette\Database\Connection:
$database = new Nette\Database\Connection($dsn, $user, $password);
Parametrul $dsn
(Data Source Name) urmează același format utilizat de PDO, de exemplu,
host=127.0.0.1;dbname=test
. În cazul în care conexiunea eșuează, se aruncă clasa
Nette\Database\ConnectionException
.
Cu toate acestea, o metodă mai convenabilă este de a utiliza configurația aplicației. Adăugați o secțiune
database
, iar obiectele necesare vor fi create, inclusiv un panou pentru baza de date în Tracy Debug Bar.
database:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: password
După aceasta, obiectul conexiune poate fi preluat ca serviciu din containerul DI, de ex:
class Model
{
public function __construct(
// or Nette\Database\Explorer
private Nette\Database\Connection $database,
) {
}
}
Pentru mai multe informații, consultați configurarea bazei de date.
Crearea manuală a exploratorului
Dacă nu utilizați containerul Nette DI, puteți crea manual o instanță a Nette\Database\Explorer
:
// database connection
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// cache storage, implements Nette\Caching\Storage, e.g.:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// handles database structure reflection
$structure = new Nette\Database\Structure($connection, $storage);
// defines rules for mapping table names, columns, and foreign keys
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);
Gestionarea conexiunilor
Atunci când creați un obiect Connection
, acesta se conectează automat la baza de date. Dacă doriți să
întârziați conectarea, activați modul leneș în configurare
prin setarea lazy
, sau procedați astfel:
$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);
Pentru a gestiona conexiunea, utilizați metodele connect()
, disconnect()
, și
reconnect()
.
connect()
stabilește o conexiune dacă aceasta nu a fost deja stabilită și poate arunca un mesajNette\Database\ConnectionException
.disconnect()
se deconectează de la baza de date.reconnect()
se deconectează și apoi se reconectează la baza de date și poate genera, de asemenea, o eroareNette\Database\ConnectionException
.
În plus, puteți monitoriza evenimentele de conectare utilizând evenimentul onConnect
, care este o matrice de
callback-uri executate după conectarea la baza de date.
// Apelat după conectarea la baza de date
$database->onConnect[] = function($database) {
echo "Connected to the database";
};
Bara de depanare Tracy
Dacă utilizați Tracy, panoul Database din Debug Bar este activat automat. Acesta afișează toate interogările executate, parametrii acestora, timpul de execuție și locația din cod în care au fost apelate.