Nette adatbázis
A Nette Database egy nagy teljesítményű és elegáns adatbázis-réteg PHP-hez, amely az egyszerűségre és az intelligens funkciókra összpontosít. Két egymást kiegészítő módot kínál az adatokkal való munkához – az Explorer használatával a gyors fejlesztéshez, vagy az SQL módon a lekérdezések teljes ellenőrzéséhez.
SQL módon
- Biztonságos, paraméterezett lekérdezések
- Az SQL-lekérdezések szerkezetének pontos ellenőrzése
- Ideális összetett lekérdezések írásához fejlett függvényekkel
- A teljesítmény optimalizálása speciális SQL függvények használatával
Felfedező út
- Gyors fejlesztés SQL írása nélkül
- A táblák közötti kapcsolatok intuitív kezelése
- Automatikus lekérdezés-optimalizálás
- Nagyszerű a gyors és kényelmes adatbázis-interakciókhoz
Telepítés
A könyvtárat a Composer segítségével 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áziskiszolgáló | DSN név | Explorer támogatás | ||||
---|---|---|---|---|---|---|
MySQL (>= 5.1) | mysql | IGEN | ||||
PostgreSQL (>= 9.0) | pgsql | IGEN | ||||
SQLite 3 (>= 3.8) | sqlite | IGEN | SQLite 3 (>= 3.8) | sqlite | IGEN | |
Oracle | oci | NEM | NEM | |||
MS SQL (PDO_SQLSRV) | sqlsrv | IGEN | YES | |||
MS SQL (PDO_DBLIB) | mssql | NEM | NEM | MS SQL (PDO_DBLIB) | mssql | NEM |
ODBC | odbc | NEM | NEM |
Az adatbázis-munka két megközelítése
A Nette Database segítségével vagy közvetlenül írhat SQL-lekérdezéseket (SQL módon), vagy hagyhatja, hogy az SQL automatikusan generálódjon (Explorer módon). Lássuk, hogyan oldja meg mindkét megközelítés ugyanazt a feladatot:
SQL-út – SQL-lekérdezések írása
// Rekord beszúrása
$database->query('INSERT INTO books', [
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// Rekordok lekérdezése: könyvszerzők
$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
');
// Megjeleníté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 "Author $author->name has written $author->books_count books:\n";
foreach ($books as $book) {
echo "- $book->title\n";
}
}
Explorer módon – 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érdezése: könyvszerzők
$authors = $database->table('authors')
->where('active', 1);
// Megjelenítés (automatikusan csak 2 optimalizált lekérdezést generál)
foreach ($authors as $author) {
$books = $author->related('books')
->order('published_at DESC');
echo "Author $author->name has written {$books->count()} books:\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 fenti példában az SQL way példa N+1 lekérdezést generál (egyet a szerzőkre és egyet az egyes szerzők könyveire), míg az Explorer csak két optimalizált lekérdezést hajt végre – egyet a szerzőkre és egyet az összes könyvükre.
Szükség szerint szabadon kombinálhatja a két megközelítést az alkalmazásban.
Csatlakozás és konfiguráció
Az adatbázishoz való csatlakozáshoz egyszerűen hozzon létre egy példányt a Nette\Database\Connection osztályból:
$database = new Nette\Database\Connection($dsn, $user, $password);
A $dsn
(adatforrás neve) paraméter ugyanazt a formátumot követi, mint amit a PDO használ, pl.
host=127.0.0.1;dbname=test
. Ha a kapcsolat sikertelen, akkor a Nette\Database\ConnectionException
.
Kényelmesebb módszer azonban az alkalmazás
konfigurációjának használata. Adjon hozzá egy database
szakaszt, és a szükséges objektumok létrejönnek,
beleértve egy adatbázis panelt a Tracy Debug Barban.
database:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: password
Ezt követően a kapcsolat objektumot szolgáltatásként lehet lekérni a DI konténerből, pl:
class Model
{
public function __construct(
// or Nette\Database\Explorer
private Nette\Database\Connection $database,
) {
}
}
További információkért lásd: Adatbázis konfiguráció.
Az Explorer manuális létrehozása
Ha nem a Nette DI konténert használja, manuálisan is létrehozhatja a Nette\Database\Explorer
egy
példányát:
// database connection
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// cache storage, implements Nette\Caching\Storage, e.g.:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// handles database structure reflection
$structure = new Nette\Database\Structure($connection, $storage);
// defines rules for mapping table names, columns, and foreign keys
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);
Kapcsolatkezelés
Amikor létrehoz egy Connection
objektumot, az automatikusan csatlakozik az adatbázishoz. Ha késleltetni
szeretné a csatlakozást, engedélyezze a konfigurációban a lusta
üzemmódot a lazy
beállításával, vagy tegye ezt a következőképpen:
$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);
A kapcsolat kezeléséhez használja a connect()
, a disconnect()
és a reconnect()
metódusokat.
- A
connect()
létrehozza a kapcsolatot, ha az még nem jött létre, és dobhat egyNette\Database\ConnectionException
. - A
disconnect()
megszakítja a kapcsolatot az adatbázissal. - A
reconnect()
megszakítja a kapcsolatot, majd újra csatlakozik az adatbázishoz, és szintén dobhat egyNette\Database\ConnectionException
.
Ezenkívül a kapcsolati eseményeket a onConnect
esemény segítségével is figyelemmel kísérheti, amely az
adatbázishoz való kapcsolódás után végrehajtott visszahívások tömbje.
// Az adatbázishoz való csatlakozás után hívódik
$database->onConnect[] = function($database) {
echo "Connected to the database";
};
Tracy Debug Bar
Ha a Tracy-t használja, a hibakeresési sáv adatbázis panelje automatikusan engedélyezve van. Megjeleníti az összes végrehajtott lekérdezést, azok paramétereit, a végrehajtás idejét és a kódban a meghívás helyét.