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ě.

Nette Database nabízí dva hlavní přístupy k práci s databází:

Database Core

  • Nízkoúrovňová vrstva
  • Bezpečné parametrizované dotazy
  • Podobné PDO, ale s lepším API
  • Vhodné když:
    • Potřebujete maximální kontrolu nad SQL dotazy
    • Píšete vlastní databázovou abstrakci
    • Provádíte komplexní databázové operace

Database Explorer

  • Vysokoúrovňová vrstva
  • Postavená nad Database Core
  • Umožňuje pracovat s daty bez psaní SQL
  • Automatická optimalizace dotazů
  • Intuitivní práce s relacemi mezi tabulkami
  • Vhodné když:
    • Chcete rychle a pohodlně pracovat s databází
    • Potřebujete automatickou optimalizaci dotazů
    • Využíváte vztahy mezi tabulkami

Instalace

Knihovnu stáhnete a nainstalujete pomocí nástroje Composer:

composer require nette/database

Připojení a konfigurace

Pro připojení k databázi vytvořte instanci třídy Nette\Database\Connection:

$db = new Nette\Database\Connection($dsn, $user, $password);

Parametr $dsn (data source name) používá stejný formát jako PDO, např. host=127.0.0.1;dbname=test.

Elegantněji můžete nastavit připojení pomocí konfiguračního souboru. Stačí přidat sekci database a framework se postará o vytvoření potřebných objektů včetně databázového panelu v Tracy.

database:
	dsn: 'mysql:host=127.0.0.1;dbname=test'
	user: root
	password: password

Objekt pro připojení pak získáte jako službu z DI kontejneru:

class Model
{
	// pro práci s vrstvou Database Explorer si předáme Nette\Database\Explorer
	public function __construct(
		private Nette\Database\Connection $db,
	) {
	}
}

Více informací o konfiguraci databáze.

Výběr vrstvy

Database Core je ideální pro přímou práci s SQL dotazy. Poskytuje bezpečné parametrizované dotazy a lepší API než PDO:

$database = new Nette\Database\Connection($dsn, $user, $password);

// SELECT dotazy
$result = $database->query('SELECT * FROM users WHERE role = ?', 'admin');
foreach ($result as $row) {
    echo $row->name;
}

// INSERT s pomocí pole
$database->query('INSERT INTO users', [
    'name' => 'John Doe',
    'email' => '[email protected]',
    'created_at' => new DateTime,
]);

Database Explorer nabízí intuitivní práci s databází bez nutnosti psát SQL dotazy:

// Vytvoření instance Exploreru
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions);

// Načtení dat
// - automaticky optimalizuje dotazy
// - načítá pouze použité sloupce
$users = $explorer->table('users');

// Jednoduché filtrování
$users->where([
    'role' => 'admin',
    'active' => true,
]);

// Práce s relacemi
foreach ($users as $user) {
    // Automaticky vytvoří efektivní JOIN
    echo $user->name;  // jméno uživatele
    echo $user->role->description;  // popis role z propojené tabulky

    // Výpis všech článků uživatele
    foreach ($user->related('articles') as $article) {
        echo $article->title;
    }
}

// Vložení dat
$users->insert([
    'name' => 'John Doe',
    'email' => '[email protected]',
]);

Obě vrstvy lze v aplikaci kombinovat – pro běžné operace použít Explorer a pro specifické případy přepnout na Core.


Automatická optimalizace výkonu

  • Inteligentní načítání souvisejících dat
  • Adaptivní načítání pouze potřebných sloupců
  • Minimalizace počtu databázových dotazů

Bezpečnost na prvním místě

  • Vestavěná ochrana proti SQL injection
  • Parametrizované dotazy
  • Bezpečné zpracování vstupních dat

Intuitivní práce s relacemi

  • Přirozený přístup k propojeným datům
  • Podpora všech typů vazeb (1:1, 1:N, M:N)
  • Bez nutnosti psát JOIN dotazy

Pohodlné debuggování

  • Panel do Tracy
  • Všechny provedené dotazy s časy
  • Vysvětlení dotazů (EXPLAIN)

Nejjednodušší parametrické dotazy

Stačí jen čárka a hodnota:

$database->query('
	SELECT *
	FROM users
	WHERE name =', $name
);

Žádné ?, :param, @param nebo jiné speciální syntaxe – prostě jen otazník.

Chytrá detekce vazeb

Nepotřebujete konfigurovat entity ani mapování:

$book = $explorer->table('book')->get(1);
// automaticky nalezne vazbu přes book.author_id
echo $book->author->name;

Adaptivní načítání dat

Automaticky načítá jen sloupce, které skutečně používáte v kódu

foreach ($books as $book) {
	// načte z databáze jen sloupec 'title'
	echo $book->title;
}

Přes 18 let vývoje

Nette vyvíjíme přes 18 let – a číslo stále roste! Knihovny, které poskytujeme, jsou proto velmi zralé, stabilní a široce používané. Věří jim řada globálních korporací a pohání mnoho významných webových stránek. Kdo používá a důvěřuje Nette?

Instalace

Knihovnu stáhnete a nainstalujete pomocí nástroje Composer:

composer require nette/database

Podporované databáze

Nette podporuje následující databáze:

Databázový server DSN jméno Podpora v Core Podpora v Explorer
MySQL (>= 5.1) mysql ANO ANO
PostgreSQL (>= 9.0) pgsql ANO ANO
Sqlite 3 (>= 3.8) sqlite ANO ANO
Oracle oci ANO
MS SQL (PDO_SQLSRV) sqlsrv ANO ANO
MS SQL (PDO_DBLIB) mssql ANO
ODBC odbc ANO