Nette Datenbank
Nette Database ist eine leistungsstarke und elegante Datenbankschicht für PHP mit dem Schwerpunkt auf Einfachheit und intelligenten Funktionen. Es bietet zwei komplementäre Möglichkeiten, mit Ihren Daten zu arbeiten – mit dem Explorer für die schnelle Entwicklung oder die SQL-Methode für die volle Kontrolle über Abfragen.
SQL-Weg
- Sichere, parametrisierte Abfragen
- Präzise Kontrolle über die Struktur von SQL-Abfragen
- Ideal für das Schreiben komplexer Abfragen mit erweiterten Funktionen
- Optimieren Sie die Leistung mit spezifischen SQL-Funktionen
Explorer Weg
- Schnelle Entwicklung ohne SQL zu schreiben
- Intuitive Handhabung von Beziehungen zwischen Tabellen
- Automatische Abfrageoptimierung
- Großartig für schnelle und bequeme Datenbankinteraktionen
Einrichtung
Sie können die Bibliothek mit Composer herunterladen und installieren:
composer require nette/database
Unterstützte Datenbanken
Nette Database unterstützt die folgenden Datenbanken:
Datenbank-Server | DSN-Name | Explorer-Unterstützung |
---|---|---|
MySQL (>= 5.1) | mysql | YES |
PostgreSQL (>= 9.0) | pgsql | YES |
SQLite 3 (>= 3.8) | sqlite | JA |
Oracle | oci | NO |
MS SQL (PDO_SQLSRV) | sqlsrv | JA |
MS SQL (PDO_DBLIB) | mssql | NEIN |
ODBC | odbc | NEIN |
Zwei Herangehensweisen an die Datenbankarbeit
Mit Nette Database können Sie entweder direkt SQL-Abfragen schreiben (SQL-Weg) oder SQL automatisch generieren lassen (Explorer-Weg). Schauen wir uns an, wie beide Ansätze dieselben Aufgaben lösen:
SQL-Weg – Schreiben von SQL-Abfragen
// Einfügen eines Datensatzes
$database->query('INSERT INTO books', [
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// Datensätze abrufen: Buchautoren
$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
');
// Anzeigen (nicht optimal, erzeugt N zusätzliche Abfragen)
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-Weg – Automatische SQL-Generierung
// Einfügen eines Datensatzes
$database->table('books')->insert([
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// Datensätze abrufen: Buchautoren
$authors = $database->table('authors')
->where('active', 1);
// Anzeigen (erzeugt automatisch nur 2 optimierte Abfragen)
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";
}
}
Der Explorer-Ansatz generiert und optimiert SQL-Abfragen automatisch. Im obigen Beispiel erzeugt das SQL-Weg-Beispiel N+1 Abfragen (eine für Autoren und eine für die Bücher jedes Autors), während der Explorer nur zwei optimierte Abfragen durchführt – eine für Autoren und eine weitere für alle ihre Bücher.
Sie können beide Ansätze in Ihrer Anwendung nach Bedarf frei kombinieren.
Anschluss und Konfiguration
Um eine Verbindung zur Datenbank herzustellen, erstellen Sie einfach eine Instanz der Klasse Nette\Database\Connection:
$database = new Nette\Database\Connection($dsn, $user, $password);
Der Parameter $dsn
(Datenquellenname) hat das gleiche Format wie PDO, z. B.
host=127.0.0.1;dbname=test
. Wenn die Verbindung fehlschlägt, wird der Fehler
Nette\Database\ConnectionException
ausgelöst.
Eine bequemere Methode ist jedoch die Verwendung der Anwendungskonfiguration. Fügen Sie einen Abschnitt
database
hinzu, und die erforderlichen Objekte werden erstellt, einschließlich eines Datenbank-Panels in der Tracy-Debug-Leiste.
database:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: password
Danach kann das Verbindungsobjekt als Dienst aus dem DI-Container abgerufen werden, z. B.:
class Model
{
public function __construct(
// or Nette\Database\Explorer
private Nette\Database\Connection $database,
) {
}
}
Weitere Informationen finden Sie unter Datenbankkonfiguration.
Manuelle Erstellung eines Explorers
Wenn Sie nicht den Nette-DI-Container verwenden, können Sie manuell eine Instanz von Nette\Database\Explorer
erstellen:
// 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);
Verbindungsmanagement
Wenn Sie ein Connection
Objekt erstellen, stellt es automatisch eine Verbindung zur Datenbank her. Wenn Sie die
Verbindung verzögern wollen, aktivieren Sie in der Konfiguration
den “Lazy Mode”, indem Sie lazy
einstellen:
$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);
Um die Verbindung zu verwalten, verwenden Sie die Methoden connect()
, disconnect()
und
reconnect()
.
connect()
baut eine Verbindung auf, wenn sie noch nicht aufgebaut wurde und kann einenNette\Database\ConnectionException
auslösen.disconnect()
trennt die Verbindung mit der Datenbank.reconnect()
trennt die Verbindung zur Datenbank und stellt sie dann wieder her, wobei auch einNette\Database\ConnectionException
ausgelöst werden kann.
Zusätzlich können Sie die Verbindungsereignisse mit dem Ereignis onConnect
überwachen, das ein Array von
Callbacks ist, die nach der Verbindung zur Datenbank ausgeführt werden.
// Wird nach der Verbindung zur Datenbank aufgerufen
$database->onConnect[] = function($database) {
echo "Connected to the database";
};
Tracy-Debug-Leiste
Wenn Sie Tracy verwenden, wird das Datenbank-Panel in der Debug-Leiste automatisch aktiviert. Es zeigt alle ausgeführten Abfragen, ihre Parameter, die Ausführungszeit und die Stelle im Code an, an der sie aufgerufen wurden.