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\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énNette\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.
