Baza de date Nette
Nette Database este un strat de bază de date puternic și elegant pentru PHP, cunoscut pentru simplitatea și caracteristicile sale inteligente. Nu necesită configurare complexă sau generare de entități, permițându-vă să începeți să lucrați cu el imediat.
Cu Nette Database, puteți lucra în două moduri:
SQL direct
- 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
Explorator
- 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
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(
private Nette\Database\Connection $database,
) {
}
}
Pentru mai multe informații, consultați configurarea bazei de date.
Două abordări ale lucrului cu baza de date
Cu Nette Database, puteți scrie interogări SQL direct (abordare directă) sau puteți lăsa ca SQL să fie generat automat (abordare Explorer). Să vedem cum rezolvă ambele abordări aceleași sarcini:
Abordare directă – 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";
}
}
Abordare Explorer – Generarea automată 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, abordarea directă 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.
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.
Baze de date acceptate
Nette Database suportă următoarele baze de date:
Database Server | DSN Name | Explorer Support |
---|---|---|
MySQL (>= 5.1) | mysql | YES |
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 |