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