Nette Database
Nette Database je výkonná a elegantní databázová vrstva pro PHP s důrazem na jednoduchost a chytré funkce. Nabízí dva způsoby práce s databází – Explorer pro rychlý vývoj aplikací, nebo SQL přístup pro přímou práci s dotazy.
SQL přístup
- 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
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 | – |
Dva přístupy k databázi
Nette Database vám dává na výběr: můžete buď psát SQL dotazy přímo (SQL přístup), nebo je nechat generovat automaticky (Explorer). Podívejme se, jak oba přístupy řeší stejné úkoly:
SQL 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 SQL 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.
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(
// nebo Nette\Database\Explorer
private Nette\Database\Connection $database,
) {
}
}
Více informací o konfiguraci databáze.
Ruční vytvoření Explorer
Pokud nepoužíváte Nette DI kontejner, můžete instanci Nette\Database\Explorer
vytvořit ručně:
// připojení k databázi
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// úložiště pro cache, implementuje Nette\Caching\Storage, např.:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// stará se o reflexi databázové struktury
$structure = new Nette\Database\Structure($connection, $storage);
// definuje pravidla pro mapování názvů tabulek, sloupců a cizích klíčů
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);
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.