Nette Database
Nette Database je výkonná a elegantní databázová vrstva pro PHP, která vyniká svou jednoduchostí použití a chytrými funkcemi. Nevyžaduje žádnou složitou konfiguraci nebo generování entit, s Nette Database můžete začít pracovat okamžitě.
S Nette Database můžete pracovat dvěma způsoby:
Direct SQL
- Bezpečné parametrizované dotazy
- Přesná kontrola nad podobou SQL dotazů
- Když píšete komplexní dotazy s pokročilými funkcemi
- Optimalizujete výkon pomocí specifických SQL funkcí
Explorer
- Vyvíjíte rychle bez psaní SQL
- Intuitivní práce s relacemi mezi tabulkami
- Oceníte automatickou optimalizaci dotazů
- Vhodné pro rychlou a pohodlnout práci s databází
Instalace
Knihovnu stáhnete a nainstalujete pomocí nástroje Composer:
composer require nette/database
Připojení a konfigurace
Pro připojení k databázi stačí vytvořit instanci třídy Nette\Database\Connection:
$database = new Nette\Database\Connection($dsn, $user, $password);
Parametr $dsn
(data source name) je stejný, jaký používá PDO, např.
host=127.0.0.1;dbname=test
. V případě selhání vyhodí výjimku
Nette\Database\ConnectionException
.
Nicméně šikovnější způsob nabízí aplikační
konfigurace, kam stačí přidat sekci database
a vytvoří se potřebné objekty a také databázový panel
v Tracy baru.
database:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: password
Poté objekt spojení získáme jako službu z DI kontejneru, např.:
class Model
{
public function __construct(
private Nette\Database\Connection $database,
) {
}
}
Více informací o konfiguraci databáze.
Dva přístupy k databázi
S Nette Database můžete pracovat dvěma způsoby – buď psaním SQL dotazů (Direct přístup), nebo nechat SQL generovat automaticky (Explorer přístup). Podívejme se, jak oba přístupy řeší stejné úkoly:
Direct přístup – SQL dotazy
// vložení záznamu
$database->query('INSERT INTO books', [
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// získání záznamů: autoři knih
$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
');
// výpis (není optimální, generuje N dalších dotazů)
foreach ($result as $author) {
$books = $database->query('
SELECT * FROM books
WHERE author_id = ?
ORDER BY published_at DESC
', $author->id);
echo "Autor $author->name napsal $author->books_count knih:\n";
foreach ($books as $book) {
echo "- $book->title\n";
}
}
Explorer přístup – automatické generování SQL
// vložení záznamu
$database->table('books')->insert([
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// získání záznamů: autoři knih
$authors = $database->table('authors')
->where('active', 1);
// výpis (automaticky generuje jen 2 optimalizované dotazy)
foreach ($authors as $author) {
$books = $author->related('books')
->order('published_at DESC');
echo "Autor $author->name napsal {$books->count()} knih:\n";
foreach ($books as $book) {
echo "- $book->title\n";
}
}
Explorer přístup generuje a optimalizuje SQL dotazy automaticky. V uvedeném příkladu první přístup vygeneruje N+1 dotazů (jeden pro autory a pak jeden pro knihy každého autora), zatímco Explorer automaticky optimalizuje dotazy a provede pouze dva – jeden pro autory a jeden pro všechny jejich knihy.
Oba přístupy lze v aplikaci libovolně kombinovat podle potřeby.
Správa připojení
Při vytvoření objektu Connection
dojde automaticky k připojení. Pokud chcete připojení odložit, použijte
lazy režim – ten zapnete v konfiguraci nastavením
lazy
, nebo takto:
$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);
Pro správu připojení využijte metody connect()
, disconnect()
a reconnect()
.
connect()
vytvoří připojení, pokud ještě neexistuje, přičemž může vyvolat výjimkuNette\Database\ConnectionException
.disconnect()
odpojí aktuální připojení k databázi.reconnect()
provede odpojení a následné znovu připojení k databázi. Tato metoda může rovněž vyvolat výjimkuNette\Database\ConnectionException
.
Kromě toho můžete sledovat události spojené s připojením pomocí události onConnect
, což je pole
callbacků, které se zavolají po navázání spojení s databází.
// proběhne po připojení k databázi
$database->onConnect[] = function($database) {
echo "Připojeno k databázi";
};
Tracy Debug Bar
Pokud používáte Tracy, aktivuje se automaticky panel Database v Debug baru, který zobrazuje všechny provedené dotazy, jejich parametry, dobu vykonání a místo v kódu, kde byly zavolány.
Podporované databáze
Nette Database podporuje následující databáze:
Databázový server | DSN jméno | Podpora v Explorer |
---|---|---|
MySQL (>= 5.1) | mysql | ANO |
PostgreSQL (>= 9.0) | pgsql | ANO |
Sqlite 3 (>= 3.8) | sqlite | ANO |
Oracle | oci | – |
MS SQL (PDO_SQLSRV) | sqlsrv | ANO |
MS SQL (PDO_DBLIB) | mssql | – |
ODBC | odbc | – |