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 izjemo Nette\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 izjemo Nette\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.

različica: 4.0