Nette Database
Nette Database ist eine leistungsfähige und elegante Datenbankschicht für PHP mit dem Fokus auf Einfachheit und intelligente Funktionen. Sie bietet zwei Arten, mit der Datenbank zu arbeiten: den Explorer für die schnelle Anwendungsentwicklung oder den SQL-Weg für die direkte Arbeit mit Queries.
SQL-Weg
- Sichere, parametrisierte Queries
- Genaue Kontrolle über den Aufbau der SQL-Queries
- Wenn Sie komplexe Queries mit fortgeschrittenen Funktionen schreiben
- Optimierung der Leistung mit spezifischen SQL-Funktionen
Explorer
- Schnell entwickeln, ohne SQL zu schreiben
- Intuitive Arbeit mit Beziehungen zwischen Tabellen
- Automatische Optimierung der Queries nutzen
- Geeignet für schnelles und bequemes Arbeiten mit der Datenbank
Installation
Die Bibliothek laden und installieren Sie mit Composer:
composer require nette/database
Unterstützte Datenbanken
Nette Database unterstützt die folgenden Datenbanken:
| Datenbankserver | DSN-Name | Explorer-Unterstützung |
|---|---|---|
| MySQL (>= 5.1) | mysql | JA |
| PostgreSQL (>= 9.0) | pgsql | JA |
| SQLite 3 (>= 3.8) | sqlite | JA |
| Oracle | oci | NEIN |
| MS SQL (PDO_SQLSRV) | sqlsrv | JA |
| MS SQL (PDO_DBLIB) | mssql | NEIN |
| ODBC | odbc | NEIN |
Zwei Zugänge zur Datenbank
Nette Database lässt Ihnen die Wahl: Sie können SQL-Queries entweder direkt schreiben (SQL-Weg) oder sie automatisch generieren lassen (Explorer). Sehen wir uns an, wie beide Zugänge dieselben Aufgaben lösen:
SQL-Weg – SQL-Queries
// Einfügen eines Datensatzes
$database->query('INSERT INTO books', [
'author_id' => $authorId,
'title' => $bookData->title,
'published_at' => new DateTime,
]);
// Laden von Datensätzen: Autoren der Bücher
$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
');
// Ausgabe (nicht optimal, erzeugt N weitere Queries)
foreach ($result as $author) {
$books = $database->query('
SELECT * FROM books
WHERE author_id = ?
ORDER BY published_at DESC
', $author->id);
echo "Autor $author->name hat $author->books_count Bücher geschrieben:\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,
]);
// Laden von Datensätzen: Autoren der Bücher
$authors = $database->table('authors')
->where('active', 1);
// Ausgabe (erzeugt automatisch nur 2 optimierte Queries)
foreach ($authors as $author) {
$books = $author->related('books')
->order('published_at DESC');
echo "Autor $author->name hat {$books->count()} Bücher geschrieben:\n";
foreach ($books as $book) {
echo "- $book->title\n";
}
}
Der Explorer-Zugang erzeugt und optimiert die SQL-Queries automatisch. Im obigen Beispiel erzeugt der SQL-Weg N+1 Queries (eine für die Autoren und dann eine für die Bücher jedes Autors), während der Explorer die Queries automatisch optimiert und nur zwei ausführt – eine für die Autoren und eine für alle ihre Bücher.
Beide Zugänge lassen sich in der Anwendung nach Bedarf beliebig kombinieren.
Verbindung und Konfiguration
Um sich mit der Datenbank zu verbinden, genügt es, eine Instanz der Klasse Nette\Database\Connection zu erzeugen:
$database = new Nette\Database\Connection($dsn, $user, $password);
Der Parameter $dsn (Data Source Name) ist derselbe, den PDO verwendet, also z. B.
host=127.0.0.1;dbname=test. Im Fehlerfall wird eine Nette\Database\ConnectionException geworfen.
Bequemer ist jedoch der Weg über die Anwendungskonfiguration, in
der Sie nur den Abschnitt database ergänzen müssen. Dadurch entstehen die nötigen Objekte und außerdem ein
Datenbank-Panel in der Tracy Bar.
database:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: password
Das Verbindungsobjekt lässt sich danach als Service aus dem DI-Container beziehen, z. B.:
class Model
{
public function __construct(
// oder Nette\Database\Explorer
private Nette\Database\Connection $database,
) {
}
}
Mehr Informationen zur Datenbankkonfiguration.
Manuelle Erstellung des Explorers
Wenn Sie den Nette DI-Container nicht verwenden, können Sie eine Instanz von Nette\Database\Explorer manuell
erzeugen:
// Verbindung zur Datenbank
$connection = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=mydatabase', 'user', 'password');
// Speicher für den Cache, implementiert Nette\Caching\Storage, z. B.:
$storage = new Nette\Caching\Storages\FileStorage('/path/to/temp/dir');
// kümmert sich um die Reflexion der Datenbankstruktur
$structure = new Nette\Database\Structure($connection, $storage);
// definiert die Regeln für das Mapping von Tabellen-, Spalten- und Fremdschlüsselnamen
$conventions = new Nette\Database\Conventions\DiscoveredConventions($structure);
$explorer = new Nette\Database\Explorer($connection, $structure, $conventions, $storage);
Verbindungsverwaltung
Beim Erzeugen eines Connection-Objekts wird die Verbindung automatisch aufgebaut. Wenn Sie den Verbindungsaufbau
verzögern wollen, verwenden Sie den Lazy-Modus – Sie schalten ihn in der Konfiguration mit lazy ein oder so:
$database = new Nette\Database\Connection($dsn, $user, $password, ['lazy' => true]);
Zur Verwaltung der Verbindung dienen die Methoden connect(), disconnect() und
reconnect().
connect()baut die Verbindung auf, falls sie noch nicht existiert, und kann dabei eineNette\Database\ConnectionExceptionwerfen.disconnect()trennt die aktuelle Verbindung zur Datenbank.reconnect()trennt die Verbindung und baut sie anschließend neu auf. Auch diese Methode kann eineNette\Database\ConnectionExceptionwerfen.
Außerdem können Sie Ereignisse rund um die Verbindung mit dem Event onConnect verfolgen, das ein Array von
Callbacks ist, die nach dem Aufbau der Verbindung zur Datenbank aufgerufen werden.
// läuft nach dem Verbinden mit der Datenbank
$database->onConnect[] = function($database) {
echo "Mit der Datenbank verbunden";
};
Das Event onQuery funktioniert ähnlich – es ist ein Array von Callbacks, die nach jeder ausgeführten Query
aufgerufen werden (auch wenn sie fehlschlägt), was sich für Logging oder Profiling eignet.
Tracy Debug Bar
Wenn Sie Tracy verwenden, wird das Panel Database in der Debug Bar automatisch aktiviert. Es zeigt alle ausgeführten Queries, ihre Parameter, die Ausführungszeit und die Stelle im Code, an der sie aufgerufen wurden.
