Nette Database
Nette Database je zmogljiva in elegantna podatkovna plast za PHP s poudarkom na preprostosti in pametnih funkcijah. Ponuja dva načina dela z bazo podatkov – Explorer za hiter razvoj aplikacij ali SQL pristop za neposredno delo s poizvedbami.
SQL pristop
- Varne parametrizirane poizvedbe
- Natančen nadzor nad obliko SQL poizvedb
- Ko pišete kompleksne poizvedbe z naprednimi funkcijami
- Optimizirate zmogljivost s specifičnimi SQL funkcijami
Explorer
- Hitro razvijate brez pisanja SQL
- Intuitivno delo z relacijami med tabelami
- Cenili boste samodejno optimizacijo poizvedb
- Primerno za hitro in udobno delo z bazo podatkov
Namestitev
Knjižnico prenesete in namestite z orodjem Composer:
composer require nette/database
Podprte podatkovne baze
Nette Database podpira naslednje podatkovne baze:
Podatkovni strežnik | Ime DSN | Podpora v Explorerju |
---|---|---|
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 | – |
Dva pristopa k bazi podatkov
Nette Database vam daje izbiro: lahko pišete SQL poizvedbe neposredno (SQL pristop) ali pa jih pustite samodejno generirati (Explorer). Poglejmo, kako oba pristopa rešujeta enake naloge:
SQL pristop – SQL poizvedbe
// 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
');
// izpis (ni optimalno, generira N dodatnih poizvedb)
foreach ($result as $author) {
$books = $database->query('
SELECT * FROM books
WHERE author_id = ?
ORDER BY published_at DESC
', $author->id);
echo "Avtor $author->name je napisal $author->books_count knjig:\n";
foreach ($books as $book) {
echo "- $book->title\n";
}
}
Pristop Explorer – 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);
// izpis (samodejno generira samo 2 optimizirani poizvedbi)
foreach ($authors as $author) {
$books = $author->related('books')
->order('published_at DESC');
echo "Avtor $author->name je napisal {$books->count()} knjig:\n";
foreach ($books as $book) {
echo "- $book->title\n";
}
}
Pristop Explorer samodejno generira in optimizira SQL poizvedbe. V navedenem primeru SQL pristop generira N+1 poizvedb (eno za avtorje in nato eno za knjige vsakega avtorja), medtem ko Explorer samodejno optimizira poizvedbe in izvede samo dve – eno za avtorje in eno za vse njihove knjige.
Oba pristopa lahko v aplikaciji poljubno kombinirate po potrebi.
Povezava in konfiguracija
Za povezavo z bazo podatkov zadostuje ustvariti instanco razreda Nette\Database\Connection:
$database = new Nette\Database\Connection($dsn, $user, $password);
Parameter $dsn
(data source name) je enak, kot ga uporablja PDO, npr.
host=127.0.0.1;dbname=test
. V primeru napake vrže izjemo Nette\Database\ConnectionException
.
Vendar pa spretnejši način ponuja konfiguracija aplikacije,
kamor zadostuje dodati sekcijo database
in ustvarijo se potrebni objekti ter tudi podatkovna plošča v Tracy baru.
database:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: password
Nato objekt povezave pridobimo kot storitev iz DI vsebnika, npr.:
class Model
{
public function __construct(
// ali Nette\Database\Explorer
private Nette\Database\Connection $database,
) {
}
}
Več informacij o konfiguraciji baze podatkov.
Ročno ustvarjanje Explorerja
Če ne uporabljate Nette DI vsebnika, lahko instanco Nette\Database\Explorer
ustvarite ročno:
// povezava z bazo podatkov
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// shramba za predpomnilnik, implementira Nette\Caching\Storage, npr.:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// skrbi za refleksijo strukture baze podatkov
$structure = new Nette\Database\Structure($connection, $storage);
// definira pravila za preslikavo imen tabel, stolpcev in tujih ključev
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);
Upravljanje povezave
Pri ustvarjanju objekta Connection
se samodejno vzpostavi povezava. Če želite povezavo odložiti, uporabite lazy
način – tega vklopite v konfiguraciji z nastavitvijo
lazy
ali takole:
$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);
Za upravljanje povezave uporabite metode connect()
, disconnect()
in reconnect()
.
connect()
ustvari povezavo, če še ne obstaja, pri čemer lahko vrže izjemoNette\Database\ConnectionException
.disconnect()
prekine trenutno povezavo z bazo podatkov.reconnect()
izvede prekinitev in nato ponovno vzpostavitev povezave z bazo podatkov. Ta metoda lahko prav tako vrže izjemoNette\Database\ConnectionException
.
Poleg tega lahko spremljate dogodke, povezane s povezavo, z uporabo dogodka onConnect
, ki je polje povratnih
klicev (callback), ki se pokličejo po vzpostavitvi povezave z bazo podatkov.
// izvede se po povezavi z bazo podatkov
$database->onConnect[] = function($database) {
echo "Povezano z bazo podatkov";
};
Tracy Debug Bar
Če uporabljate Tracy, se samodejno aktivira plošča Database v Debug baru, ki prikazuje vse izvedene poizvedbe, njihove parametre, čas izvedbe in mesto v kodi, kjer so bile poklicane.
