Nette Datenbank
Nette Database ist eine leistungsstarke und elegante Datenbankschicht für PHP, die für ihre Einfachheit und intelligenten Funktionen bekannt ist. Sie erfordert keine komplexe Konfiguration oder Entity-Generierung, so dass Sie sofort mit ihr arbeiten können.
Mit Nette Database können Sie auf zwei Arten arbeiten:
Direktes SQL
- 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
Entdecker
- 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
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(
private Nette\Database\Connection $database,
) {
}
}
Weitere Informationen finden Sie unter Datenbankkonfiguration.
Zwei Herangehensweisen an die Datenbankarbeit
Mit Nette Database können Sie entweder direkt SQL-Abfragen schreiben (Direct approach) oder SQL automatisch generieren lassen (Explorer approach). Schauen wir uns an, wie beide Ansätze dieselben Aufgaben lösen:
Direkter Ansatz – 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-Ansatz – 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 der direkte Ansatz 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 für alle ihre Bücher.
Sie können beide Ansätze in Ihrer Anwendung nach Bedarf frei kombinieren.
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.
Unterstützte Datenbanken
Nette Database unterstützt die folgenden Datenbanken:
Datenbankserver | DSN Name | Explorer Support |
---|---|---|
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 |