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, ésNette\Database\ConnectionExceptionkivé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énNette\Database\ConnectionExceptionkivé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.
