Podatkovna zbirka Nette
Nette Database je zmogljiv in eleganten sloj podatkovne baze za PHP, znan po svoji preprostosti in pametnih funkcijah. Ne zahteva zapletene konfiguracije ali ustvarjanja entitet, zato lahko z njo začnete delati takoj.
Z Nette Database lahko delate na dva načina:
Neposredni SQL
- Varne, parametrirane poizvedbe
- Natančen nadzor nad strukturo poizvedb SQL
- Idealno za pisanje zapletenih poizvedb z naprednimi funkcijami
- Optimizacija zmogljivosti z uporabo posebnih funkcij SQL
Raziskovalec
- Hiter razvoj brez pisanja SQL
- Intuitivno upravljanje razmerij med tabelami
- Samodejna optimizacija poizvedb
- Odlično za hitro in priročno interakcijo s podatkovno bazo
Namestitev
Knjižnico lahko prenesete in namestite s programom Composer:
composer require nette/database
Povezava in konfiguracija
Če se želite povezati s podatkovno zbirko, preprosto ustvarite primerek razreda Nette\Database\Connection:
$database = new Nette\Database\Connection($dsn, $user, $password);
Parameter $dsn
(ime vira podatkov) ima enako obliko, kot jo uporablja PDO, npr.
host=127.0.0.1;dbname=test
. Če povezava ne uspe, se vrže razred
Nette\Database\ConnectionException
.
Vendar je priročnejša metoda uporaba konfiguracije aplikacije. Dodajte razdelek
database
in ustvarjeni bodo potrebni objekti, vključno s ploščo podatkovne zbirke v Tracy Debug Bar.
database:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: password
Po tem lahko objekt povezave pridobite kot storitev iz vsebnika DI, npr:
class Model
{
public function __construct(
private Nette\Database\Connection $database,
) {
}
}
Za več informacij glejte Konfiguracija podatkovne baze.
Dva pristopa k delu s podatkovno bazo
V podatkovni zbirki Nette lahko poizvedbe SQL pišete neposredno (neposredni pristop) ali pustite, da se SQL generira samodejno (pristop raziskovalca). Oglejmo si, kako oba pristopa rešujeta iste naloge:
Neposredni pristop – pisanje poizvedb SQL
// Vstavljanje zapisa
$database->query('INSERT INTO books', [
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// Pridobivanje zapisov: avtorji knjig
$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
');
// Prikaz (ni optimalno, ustvarja N dodatnih poizvedb)
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";
}
}
Raziskovalni pristop – samodejno generiranje SQL
// Vstavljanje zapisa
$database->table('books')->insert([
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// Pridobivanje zapisov: avtorji knjig
$authors = $database->table('authors')
->where('active', 1);
// Prikaz (samodejno ustvari le 2 optimizirani poizvedbi)
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";
}
}
Pristop Explorer samodejno generira in optimizira poizvedbe SQL. V zgornjem primeru neposredni pristop ustvari N+1 poizvedb (eno za avtorje in eno za knjige vsakega avtorja), medtem ko raziskovalec izvede le dve optimizirani poizvedbi – eno za avtorje in drugo za vse njihove knjige.
Oba pristopa lahko po potrebi poljubno kombinirate v svoji aplikaciji.
Upravljanje povezav
Ko ustvarite objekt Connection
, se ta samodejno poveže s podatkovno bazo. Če želite povezavo odložiti, v konfiguraciji omogočite leni način z nastavitvijo lazy
, ali pa to storite na
naslednji način:
$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);
Za upravljanje povezave uporabite metode connect()
, disconnect()
in reconnect()
.
connect()
vzpostavi povezavo, če še ni bila vzpostavljena, in lahko vrže metodoNette\Database\ConnectionException
.disconnect()
prekine povezavo s podatkovno zbirko.reconnect()
prekine povezavo in se nato ponovno poveže s podatkovno zbirko, pri čemer lahko vrže tudiNette\Database\ConnectionException
.
Poleg tega lahko spremljate dogodke povezave z uporabo dogodka onConnect
, ki je niz povratnih klicev, izvedenih
po vzpostavitvi povezave s podatkovno bazo.
// se pokliče po vzpostavitvi povezave s podatkovno bazo
$database->onConnect[] = function($database) {
echo "Connected to the database";
};
Tracy Debug Bar
Če uporabljate program Tracy, je plošča Podatkovna baza v vrstici za odpravljanje napak samodejno omogočena. Na njej so prikazane vse izvedene poizvedbe, njihovi parametri, čas izvedbe in mesto v kodi, kjer so bile poklicane.
Podprte zbirke podatkov
Podatkovna baza Nette podpira naslednje podatkovne baze:
Server zbirke podatkov | Naziv DNS | Podpora za raziskovalca | |
---|---|---|---|
MySQL (>= 5.1) | mysql | YES | |
PostgreSQL (>= 9.0) | pgsql | DA | |
SQLite 3 (>= 3.8) | sqlite | DA | DA |
Oracle | oci | NE | |
MS SQL (PDO_SQLSRV) | sqlsrv | DA | |
MS SQL (PDO_DBLIB) | mssql | NE | |
ODBC | odbc | NE | NE |