Nette Database

A Nette Database egy erőteljes és elegáns adatbázis réteg PHP számára, hangsúlyt fektetve az egyszerűségre és az okos funkciókra. Kétféle módot kínál az adatbázissal való munkára – Explorer az alkalmazások gyors fejlesztéséhez, vagy SQL megközelítés a lekérdezésekkel való közvetlen munkához.

SQL megközelítés

  • Biztonságos paraméterezett lekérdezések
  • Pontos ellenőrzés az SQL lekérdezések formája felett
  • Amikor komplex lekérdezéseket ír haladó funkciókkal
  • Optimalizálja a teljesítményt specifikus SQL funkciók segítségével

Explorer

  • Gyorsan fejleszthet SQL írása nélkül
  • Intuitív munka a táblák közötti kapcsolatokkal
  • Értékelni fogja a lekérdezések automatikus optimalizálását
  • Alkalmas gyors és kényelmes adatbázis-kezelésre

Telepítés

A könyvtárat a Composer eszközzel töltheti le és telepítheti:

composer require nette/database

Támogatott adatbázisok

A Nette Database a következő adatbázisokat támogatja:

Adatbázis szerver DSN név Támogatás az Explorerben
MySQL (>= 5.1) mysql IGEN
PostgreSQL (>= 9.0) pgsql IGEN
Sqlite 3 (>= 3.8) sqlite IGEN
Oracle oci
MS SQL (PDO_SQLSRV) sqlsrv IGEN
MS SQL (PDO_DBLIB) mssql
ODBC odbc

Két megközelítés az adatbázishoz

A Nette Database választási lehetőséget kínál: vagy közvetlenül írhat SQL lekérdezéseket (SQL megközelítés), vagy hagyhatja, hogy automatikusan generálódjanak (Explorer). Nézzük meg, hogyan oldják meg mindkét megközelítéssel ugyanazokat a feladatokat:

SQL megközelítés – SQL lekérdezések

// rekord beszúrása
$database->query('INSERT INTO books', [
	'author_id' => $authorId,
	'title' => $bookData->title,
	'published_at' => new DateTime,
]);

// rekordok lekérése: könyvek szerzői
$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
');

// listázás (nem optimális, N további lekérdezést generál)
foreach ($result as $author) {
	$books = $database->query('
		SELECT * FROM books
		WHERE author_id = ?
		ORDER BY published_at DESC
	', $author->id);

	echo "Szerző $author->name írt $author->books_count könyvet:\n";

	foreach ($books as $book) {
		echo "- $book->title\n";
	}
}

Explorer megközelítés – automatikus SQL generálás

// rekord beszúrása
$database->table('books')->insert([
	'author_id' => $authorId,
	'title' => $bookData->title,
	'published_at' => new DateTime,
]);

// rekordok lekérése: könyvek szerzői
$authors = $database->table('authors')
	->where('active', 1);

// listázás (automatikusan csak 2 optimalizált lekérdezést generál)
foreach ($authors as $author) {
	$books = $author->related('books')
		->order('published_at DESC');

	echo "Szerző $author->name írt {$books->count()} könyvet:\n";

	foreach ($books as $book) {
		echo "- $book->title\n";
	}
}

Az Explorer megközelítés automatikusan generálja és optimalizálja az SQL lekérdezéseket. A megadott példában az SQL megközelítés N+1 lekérdezést generál (egyet a szerzőkhöz, majd egyet minden szerző könyveihez), míg az Explorer automatikusan optimalizálja a lekérdezéseket, és csak kettőt hajt végre – egyet a szerzőkhöz és egyet az összes könyvükhöz.

Mindkét megközelítés tetszés szerint kombinálható az alkalmazásban, igény szerint.

Csatlakozás és konfiguráció

Az adatbázishoz való csatlakozáshoz elegendő létrehozni egy Nette\Database\Connection osztálypéldányt:

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

A $dsn (data source name) paraméter ugyanaz, amit a PDO használ, pl. host=127.0.0.1;dbname=test. Hiba esetén Nette\Database\ConnectionException kivételt dob.

Azonban egy ügyesebb módszert kínál az alkalmazáskonfiguráció, ahová elegendő hozzáadni egy database szekciót, és létrejönnek a szükséges objektumok, valamint az adatbázis panel a Tracy sávban.

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

Ezután a kapcsolat objektumot szolgáltatásként kapjuk meg a DI konténerből, pl.:

class Model
{
	public function __construct(
		// vagy Nette\Database\Explorer
		private Nette\Database\Connection $database,
	) {
	}
}

További információk az adatbázis konfigurációjáról.

Explorer manuális létrehozása

Ha nem használja a Nette DI konténert, manuálisan is létrehozhat egy Nette\Database\Explorer példányt:

// csatlakozás az adatbázishoz
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// tároló a cache-hez, implementálja a Nette\Caching\Storage-ot, pl.:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// gondoskodik az adatbázis struktúra reflexiójáról
$structure = new Nette\Database\Structure($connection, $storage);
// definiálja a táblanevek, oszlopnevek és idegen kulcsok leképezési szabályait
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);

Kapcsolatkezelés

A Connection objektum létrehozásakor a csatlakozás automatikusan megtörténik. Ha késleltetni szeretné a csatlakozást, használja a lazy módot – ezt a konfigurációban a lazy beállításával, vagy így kapcsolhatja be:

$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);

A kapcsolat kezeléséhez használja a connect(), disconnect() és reconnect() metódusokat.

  • connect() létrehozza a kapcsolatot, ha még nem létezik, és Nette\Database\ConnectionException kivételt dobhat.
  • disconnect() megszakítja az aktuális adatbázis-kapcsolatot.
  • reconnect() megszakítja, majd újra csatlakoztatja az adatbázishoz. Ez a metódus szintén Nette\Database\ConnectionException kivételt dobhat.

Ezenkívül figyelheti a csatlakozással kapcsolatos eseményeket az onConnect esemény segítségével, amely egy callback tömb, amely az adatbázissal való kapcsolat létrejötte után hívódik meg.

// az adatbázishoz való csatlakozás után fut le
$database->onConnect[] = function($database) {
	echo "Csatlakozva az adatbázishoz";
};

Tracy Debug Bar

Ha Tracy-t használ, a Database panel automatikusan aktiválódik a Debug sávban, amely megjeleníti az összes végrehajtott lekérdezést, azok paramétereit, végrehajtási idejét és a kódban való meghívásuk helyét.

verzió: 4.0